我有一个类似于下面的示例数据框的数据框:
stuff = data.frame(
banana = c(1,0,1,1,0,0,1,0,1,1),
apple = c(0,0,0,1,1,0,0,1,1,1),
bike = c(1,1,0,1,1,1,1,0,0,0),
car = c(0,0,0,0,0,0,1,1,0,0)
)
我想创建一个引用其他列的值的列,并且如果
TRUE
将列标签添加到该新列。在基于列 fruits
和 banana
添加列 apple
的情况下,理想情况下会导致这种情况(我不太关心存在多个单词的格式,只要它以一致的方式捕获即可)订单):
> stuff
banana apple bike car fruits
1 1 0 1 0 banana
2 0 0 1 0 0
3 1 0 0 0 banana
4 1 1 1 0 bananaapple
5 0 1 1 0 apple
6 0 0 1 0 0
7 1 0 1 1 banana
8 0 1 0 1 apple
9 1 1 0 0 bananaapple
10 1 1 0 0 bananaapple
我已经看到在
mutate
中使用 dplyr
完成此操作,但是我的数据集有许多列和行,因此我需要找到一种方法以 for 循环方式执行此操作,迭代列标签向量并添加如果 TRUE
,则连续标记到新列。我草率地尝试将 for 循环和 mutate
结合起来(如下所示),但这不起作用,因为它无法识别 for 循环中的变量 fruit
:
fruits1 = c('banana','apple')
for (fruit in fruits1){
stuff %>%
mutate(fruits = case_when(
fruit == TRUE ~ fruit,
FALSE ~ FALSE
))
}
如果有关于如何更大规模地执行此操作并执行类似代码的建议,我将不胜感激。
您可以执行
stuff > 0
创建一个矩阵,然后在行 (apply
) 上执行 intersect
MARGIN=1
。
> stuff |>
+ cbind(
+ sapply(list(fruits1=fruits1, fruits2=fruits2, fruits3=fruits3), \(y) {
+ apply(stuff > 0, 1, \(x) {
+ o <- intersect(names(stuff)[x], y)
+ if (!length(o)) NA else toString(o)
+ })
+ })
+ )
banana apple bike car fruits1 fruits2 fruits3
1 1 0 1 0 banana bike banana, bike
2 0 0 1 0 <NA> bike bike
3 1 0 0 0 banana <NA> banana
4 1 1 1 0 banana, apple apple, bike banana, bike
5 0 1 1 0 apple apple, bike bike
6 0 0 1 0 <NA> bike bike
7 1 0 1 1 banana bike banana, bike, car
8 0 1 0 1 apple apple car
9 1 1 0 0 banana, apple apple banana
10 1 1 0 0 banana, apple apple banana