gpt4 book ai didi

r - 仅使用 tidy 有条件地用 R 中的列名替换行子集的值

转载 作者:行者123 更新时间:2023-12-04 12:35:46 26 4
gpt4 key购买 nike

我正在寻找一种方法来有条件地用保留在 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

除非它是实际的列名而不是“列名”。我在这里使用了两个不同的答案来了解条件列的变异(这就是我如何得到我的示例)以及如何用列名替换某些值(我当前的示例中未使用但答案是 here ) .

我可以结合这两个答案来让它工作:

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

我承认上面的过程是完全正常的,但出于纯粹的好奇心,有没有办法在没有第二段代码的情况下做到这一点?是否有一些函数可以插入 replace(.,.=='Y',values="column name") 步骤的 values= 部分,可以捕获列名称并在单个 mutate_at 函数中执行整个过程?

最佳答案

您可以在 mutate_at 函数中做一些 tidyeval 来获取列名,然后使用 ifelse(或您可能想要的任何其他逻辑结构)来替换某些值.

library(tidyverse)

wl %>%
mutate_at(vars(starts_with("AB")), function(x) {
x_var <- rlang::enquo(x)
ifelse(x == "Y", rlang::quo_name(x_var), x)
})
#> # 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

reprex package 创建于 2018-08-16 (v0.2.0).

关于r - 仅使用 tidy 有条件地用 R 中的列名替换行子集的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51883291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com