【问题标题】:Check if any n columns contains the same value using R?使用 R 检查是否有任何 n 列包含相同的值?
【发布时间】:2021-04-14 13:21:21
【问题描述】:

我有一个如下所示的数据框:

 a    b    c    d      
 1    0    1    1      
.5    1    1    0      
.5    1   .5   .5     
 0    0    1    NA     
 0    1    0    1     

我想检查 3 列中的任何一列是否包含相同的值,因此输出如下所示:

 val.   count
  1      1
 .5      1 

我正在尝试对任意 n 个列执行此操作。到目前为止,我只是使用 ifelse 语句对每个场景进行硬编码,如下所示:

  t <- data %>%
        select(ivs) %>% 
        mutate(all = ifelse(a == 1 &
                          b == 1 &        
                          c == 1 &       
                          d == 1, 1 , 0),
               any_3 = ifelse((a == 1 &
                     b == 1 &
                     c == 1 &       
                     d == 0) | 
                    (a == 1 &
                     b == 1 &
                     c == 0 &       
                     d == 1) |
                    (a == 0 &
                     b == 1 &
                     c == 1 &       
                     d == 1)|
                    (a == 0 &
                     b == 1 &
                     c == 1 &       
                     d == 1), 1, 0 ) )
        

我希望有更好的方法来做到这一点。谢谢!

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

    这是一种更简单的方法,但输出略有不同。
    它的工作原理是

    1. 使用combn得到df1的(列)向量的组合,3乘3;
    2. 对于每个组合,应用一个匿名函数来检查所有值是否都等于第一个值,因此是否都等于另一个。

    然后,table 将结果强制转换为 data.frame。

    val <- combn(df1, 3, function(x) {
      apply(x, 1, function(y) if(!anyNA(y) & all(y == y[1])) y[1] else NA )
    })
    as.data.frame(table(val))
    #  val Freq
    #1 0.5    1
    #2   1    1
    

    数据

    df1 <- read.table(text = "
    a    b    c    d
     1    0    1    1
    .5    1    1    0
    .5    1   .5   .5
     0    0    1    NA
     0    1    0    1
    ", header = TRUE)
    

    【讨论】:

      【解决方案2】:

      这是purrr:pmapdplyr::enframe 的一种方法。这有点深奥,但不需要combn 的开销。

      pmap 按行处理 data.frames。我们可以使用c(...) 访问该行。一旦我们用表生成了计数,我们可以使用map_dfr 将表子集到计数大于我们目标的那些。如果有 6 列并且说 3 是 1,3 是 2,这将起作用。enframe 允许我们将命名向量转换为 data.frame。 map_dfr 版本返回由行绑定的 data.frame。最后,我们可以统计一个值在表中任意位置出现超过 3 次的次数。

      library(dplyr)
      library(purrr)
      data %>% 
         pmap(~table(c(...))) %>%
         map_dfr(~enframe(.x[.x >= 3])) %>%
         group_by(name) %>%
         tally
      # A tibble: 2 x 2
        name      n
        <chr> <int>
      1 0.5       1
      2 1         1
      

      您可以根据自己的喜好更改行名。这种方法的一个缺点是在调用 table 时值会变成字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-28
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        相关资源
        最近更新 更多