使用dplyr包在R中更改数据框或tibble中选择的列

3

我想一次性将 mutate 函数应用于多个列。这些列以特定的字符开头,这就是它们的标识方式。我还想知道如何将其应用于由索引标记的列,例如 data_fake[3:4]。目标是删除所有非数字字符并将值转换为数字。可惜我无法做到。所需结果在代码末尾给出。非常感谢。

data_fake <- data.frame(c("1","2","NA","3,","2","1 only"),c(1,2,3,4,5,6),
                        c("23","3 bundles","4","5","NA","1"), c("3","5 packs","6","78","7","8"))
colnames(data_fake) <- c("AB foo ab", "AB foo bc", "CD foo ab","CD foo bc")

data_fake <- as_tibble(data_fake)

data_fake %>%
        select(starts_with("CD foo")) %>% 
        mutate(as.numeric(gsub("[^0-9]", "")))

data_fake_results <- as_tibble(data.frame(c("1","2","NA","3,","2","1 only"),c(1,2,3,4,5,6),
                        c(23,3,4,5,NA,1), c(3,5,6,78,7,8)))

请参阅?mutate_if。你需要给gsub三个参数,即patternreplacementx,其中x是要查找的字符串。 - Gregor Thomas
1
可能是dplyr更改许多数据类型的重复问题。 - camille
在我标记为重复的帖子中,一些答案已经过时,但是这个使用了当前的dplyr选择器。 - camille
1个回答

5
我们可以使用mutate_at
library(tidyverse)
data_fake %>%
    mutate_at(vars(3:4), funs(as.numeric(str_remove(., "\\s+[a-z]+"))))

或者使用parse_number

data_fake %>%
     mutate_at(3:4, parse_number)

如果我们想在 mutate_at 中匹配列名称

data_fake %>% 
    mutate_at(vars(starts_with("CD")), parse_number)

1
太棒了!那么如何通过标题选择列(这里它们应该以“CD foo”开头)来执行完全相同的操作呢? - MIH
1
@MIH mutate_at(vars(starts_with("CD")))@MIH mutate_at(vars(starts_with("CD"))) - akrun
1
@MIH:您可以在?select中找到用于指定列的所有函数。mutatetransmuterename等作用域(*_at)版本使用与select相同的指定函数。 - divibisan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接