gpt4 book ai didi

r - 有条件地将数据框中的值更改为其列名

转载 作者:行者123 更新时间:2023-12-04 11:18:45 24 4
gpt4 key购买 nike

我有一个看起来像这样的数据框

set.seed(123)
test_data <- data.frame(id = 1:6,
var1 = rbinom(n = 6, size = 1, prob = .5),
var2 = rbinom(n = 6, size = 1, prob = .5),
age = sample(18:30, size = 6, replace = T))


我想使用 dplyrpurrrvar1var2中等于1的值更改为其列的名称,并保持0不变。

结果看起来像这样。

id    var1  var2    age
1 0 var2 26
2 var1 var2 25
3 0 var2 19
4 var1 0 29
5 var1 var2 21
6 0 0 18


我尝试使用 dplyr::mutate_at

mutate_at(test_data,
vars(var1, var2),
function(var_x) { ifelse(var_x == 1, colnames(var_x), var_x) })


这将返回以下错误。因此,可能不是最好的方法。


evalq(sys.calls(),)中的错误:替换具有长度
零另外:警告消息:In rep(是,length.out =
length(ans)):“ x”为NULL,因此结果为NULL


我尝试使用 purrr:map_at

map_at(test_data, 
c("var1", "var2"),
function(var_x) { ifelse(var_x == 1, colnames(var_x), var_x) })


这将返回此错误。


ans [test&ok]中的错误<-rep(是,length.out = length(ans))[test&
ok]:替换的长度为零另外:警告消息:在
rep(是,length.out = length(ans)):'x'为NULL,因此结果将是
空值


虽然我更喜欢使用 dplyrpurrr,但我愿意接受使用其他方法的建议。

最佳答案

这是通过tidyverse提出的想法。这里的技巧是先gather,替换值,然后spread

library(tidyverse)

test_data %>%
gather(var, val, -c(id, age)) %>%
mutate(val = ifelse(val == 1, var, val)) %>%
spread(var, val)

# id age var1 var2
#1 1 26 0 var2
#2 2 25 var1 var2
#3 3 19 0 var2
#4 4 29 var1 0
#5 5 21 var1 var2
#6 6 18 0 0

关于r - 有条件地将数据框中的值更改为其列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44640355/

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