使用for循环基于许多列和列标签创建列?

问题描述 投票:0回答:1

我有一个类似于下面的示例数据框的数据框:

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
    ))
}

如果有关于如何更大规模地执行此操作并执行类似代码的建议,我将不胜感激。

r for-loop dplyr mutate
1个回答
0
投票

您可以执行

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
© www.soinside.com 2019 - 2024. All rights reserved.