我有以下 df。
empid cond1 cond2 cond3 cond4
234 1 0 1 1
7890 2 1 1 0
38476 1 1 0 1
456 0 1 1 0
empid 列是字符类型,其余都是数字列。 我需要每个 cond1、cond2、cond3 和 cond4 的值大于 0 的 empid 列表。 现在,我正在创建 2:5 的列名称列表,使用 for 循环 遍历列,选择然后过滤该特定列。
我觉得使用 lapply 可以更有效地完成它,但我不确定如何包含要选择的列,因为我的结果中只需要 empid 列。
作为输出,有效的可能是一个新的列表对象,其中包含 empid 过滤的值。 因此,例如: 新列表对象,
cond1 <- "234","7890","38476"
提前谢谢您。
最佳答案
这是通过基础 R 的解决方案,
aggregate(empid ~ ind, subset(cbind(empid = df$empid, stack(df[-1])), values > 0), list)
# ind empid
#1 cond1 234, 7890, 38476
#2 cond2 7890, 38476, 456
#3 cond3 234, 7890, 456
#4 cond4 234, 38476
注意:
如果我们将empid
保留为一个字符,它会将stack
与factor混淆。为了避免这种情况,我们可以在子集
中添加as.integer()
,即
aggregate(empid ~ ind, subset(cbind(empid = as.integer(df$empid), stack(df[-1])), values > 0), list)
关于r - 数据帧的按列过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59950672/