R语言 如果列名包含字符串,则替换列中的值

ohtdti5x  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(213)

我当前正在手动替换列中的所有值。如果列名包含ABCDEF,我是否可以将列中的所有值替换为0,而无需手动选择列并替换为0?
以下是我的df:

> dput(df)
structure(list(FFF = c(34L, 22L, 22L), ABC_1 = 3:5, DEF_2 = c(2L, 
2L, 2L), KKL = c(3L, 2L, 234L)), class = "data.frame", row.names = c(NA, 
-3L))

所需输出:

> dput(df2)
structure(list(FFF = c(34L, 22L, 22L), ABC_1 = c(0L, 0L, 0L), 
    DEF_2 = c(0L, 0L, 0L), KKL = c(3L, 2L, 234L)), class = "data.frame", row.names = c(NA, 
-3L))
e4yzc0pl

e4yzc0pl1#

这里我们可以使用mutate_at并通过vars(matches())提供列命名模式

library(tidyverse)

df %>% mutate_at(vars(matches('ABC|DEF')), ~ 0)

  FFF ABC_1 DEF_2 KKL
1  34     0     0   3
2  22     0     0   2
3  22     0     0 234

对于Tarjae提出的观点,在dplyr的最新版本中,下面的内容似乎是首选的,无论哪种方式都是相同的想法。

df %>% mutate(across(matches('ABC|DEF'),  ~ 0))
laximzn5

laximzn52#

碱基R:

df[, grep("ABC|DEF", colnames(df))] <- 0

使用dplyr:

一般来说:“作用域动词(_if、_at、_all)已被现有动词中pick()across()的使用所取代...”https://dplyr.tidyverse.org/reference/mutate_all.html

library(dplyr)

df %>% 
  mutate(across(contains("ABC") | contains("DEF"), ~0))
FFF ABC_1 DEF_2 KKL
1  34     0     0   3
2  22     0     0   2
3  22     0     0 234

相关问题