我有一个数据框,长这样
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))
我想使用 dplyr
或 purrr
来将 var1
和 var2
中等于 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(), ) 中的错误: replacement has length zero In addition: Warning message: In rep(yes, length.out = length(ans)) : 'x' is NULL so the result will be NULL
我已经尝试使用 purrr:map_at
map_at(test_data,
c("var1", "var2"),
function(var_x) { ifelse(var_x == 1, colnames(var_x), var_x) })
而这会返回以下错误。
Error in ans[test & ok] <- rep(yes, length.out = length(ans))[test & ok] : 替换的长度为零此外:警告信息:在rep(yes,length.out = length(ans))中:'x'为NULL,因此结果将是NULL
虽然我更倾向于使用dplyr
或purrr
,但我也愿意尝试使用其他方法。
Map
-test_data[2:3] <- Map(function(x,y) replace(x,x==1,y), test_data[2:3], names(test_data[2:3]) )
- thelatemail