【问题标题】:Selecting columns based on row values in multiple columns using dplyr使用 dplyr 根据多列中的行值选择列
【发布时间】:2017-12-06 08:05:51
【问题描述】:

我正在尝试选择至少一行等于 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'))

【问题讨论】:

  • 您最好将数据转换为长格式。您觉得这很困难的原因是您尝试以宽格式计算它。
  • @docendodiscimus 感谢您的提示,这似乎确实更容易!

标签: r dplyr


【解决方案1】:

一个解决方案,不使用 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 所建议的那样,转换为长格式更容易

    【讨论】:

      猜你喜欢
      • 2020-12-23
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2018-01-20
      相关资源
      最近更新 更多