我正在寻找一种方法来有条件地替换列子集中的某些值,该列名保留在 tidyverse 中。请参见下面的示例:
wl <- data_frame(x=1:4,
multi=c("Y","Y","Y","Y"),
ABC=c("","Y","Y",""),
ABD=c("","","",""),
ABE=c("Y","Y","","Y"))
# A tibble: 4 x 5
x multi ABC ABD ABE
<int> <chr> <chr> <chr> <chr>
1 1 Y "" "" Y
2 2 Y Y "" Y
3 3 Y Y "" ""
4 4 Y "" "" Y
df <- wl %>% mutate_at(vars(matches("AB")),
funs(replace(.,.=='Y',values="column name")))
# A tibble: 4 x 5
x multi ABC ABD ABE
<int> <chr> <chr> <chr> <chr>
1 1 Y "" "" column name
2 2 Y column name "" column name
3 3 Y column name "" ""
4 4 Y "" "" column name
除了它将是实际的列名而不是“列名”。我在这里使用了两个不同的答案来对条件列进行变异(这就是我的示例)以及如何用列名替换某些值(在我当前的示例中未使用,但答案在这里) .
我可以结合这两个答案来让它工作:
w <- which(df=="column name",arr.ind=TRUE)
df[w] <- names(df)[w[,"col"]]
# A tibble: 4 x 5
x multi ABC ABD ABE
<int> <chr> <chr> <chr> <chr>
1 1 Y "" "" ABE
2 2 Y ABC "" ABE
3 3 Y ABC "" ""
4 4 Y "" "" ABE
我承认上面的过程是完全正常的,但出于纯粹的好奇,有没有办法在没有第二块代码的情况下做到这一点?是否有一些函数可以插入到可以捕获列名并在单个函数中执行整个过程values=的步骤部分中?replace(.,.=='Y',values="column name")mutate_at