首页 文章

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

提问于
浏览
4

我试图选择至少有一行等于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行X 314列)上运行它 .

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

2 回答

  • 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所建议的那样,转换为长格式更容易

  • 2

    一个解决方案,不使用dplyr:

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

相关问题