使用dplyr根据多列行值选择列

5
我正在尝试选择那些至少有一行等于1的列,但前提是同一行在第二列中也有特定的值。我希望使用dplyr实现此目标,但欢迎任何计算效率高的解决方案。
例如:选择包含a1、a2、a3列的列,在这些列中至少有一个值为1并且列b=="B"。
示例数据:
rand <- function(S) {set.seed(S); sample(x = c(0,1),size = 3, replace=T)}
df <- data.frame(a1=rand(1),a2=rand(2),a3=rand(3),b=c("A","B","A"))

输入数据:

  a1 a2 a3 b
1  0  0  0 A
2  0  1  1 B
3  1  1  0 A

期望的输出结果:

  a2 a3
1  0  0
2  1  1
3  1  0

我成功地使用以下代码获得了正确的输出,但这是一个非常低效的解决方案,而且我需要在一个非常大的数据框(365,000行X314列)上运行它。

df %>% select_if(function(x) any(paste0(x,.$b) == '1B'))

2
你最好将数据转换为长格式。你觉得这很困难的原因是因为你试图在宽格式中计算它。 - talat
@docendodiscimus 感谢您的提示,这似乎确实更容易! - cmdoret
2个回答

3

不使用 dplyr 的解决方案:

df[sapply(df[df$b == "B",], function(x) 1 %in% x)]

2

这里是我的 dplyr 解决方案:

ids <- df %>% 
  reshape2::melt(id.vars = "b") %>% 
  filter(value == 1 & b == "B") %>% 
  select(variable)

df[,unlist(ids)]

#  a2 a3
#1  0  0
#2  1  1
#3  1  0

正如@docendo-discimus所建议的那样,转换为长格式更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接