【问题标题】:Returning a true value if it is a close match among different columns in r如果它是 r 中不同列之间的紧密匹配,则返回一个真值
【发布时间】:2020-11-24 05:33:49
【问题描述】:

数据如下:

a <- c('id1','id2','id3','id4','id5')
b <- c(5,10,7,2,3)
d <- c(5.2,150,123,5,7)
e <- c(5.4,0,10,3,5)

df1 <- data.frame(a,b,d,e)

我想在此数据框中创建一个新列,返回 TRUE 和 FALSE。如果所有值之间的差异在 5% 以内,则为 true,否则为 false。

例如,对于“id1”,b、d 和 e 列的值分别为 5、5.2、5.4。所以所有这些都在 5% 以内,因此 new_col 应该是真的。对于“id2”,b、d 和 e 列的值分别为 10,150,0。因此,它们之间的比例不为 5%,因此应该为 false。

期望的输出

【问题讨论】:

    标签: r


    【解决方案1】:

    这会查看每行的最小值的 1.05 倍小于最大值的 0.95 倍。 (我假设这就是您所说的彼此相距 %5 以内的意思。)

    sapply(1:nrow(df1), function(i) (min(df1[i, 2:4]) * 1.05) > 
         (0.95 * max(df1[i, 2:4])))
    # [1]  TRUE FALSE FALSE FALSE FALSE
    

    做同样事情的方式略有不同。

    sapply(1:nrow(df1), function(i) diff(range(df1[i, 2:4]) * 
        c(1.05, 0.95)) <= 0)
    # [1]  TRUE FALSE FALSE FALSE FALSE
    

    【讨论】:

    • 相同但使用apply:apply(df1[-1], 1, function(x) diff(range(x) * c(1.05, 0.95)) &lt;= 0)
    • 这看起来好多了。
    【解决方案2】:

    这行得通吗:

    library(dplyr)
    library(data.table)
    df1 %>% rowwise() %>% mutate(new_col = case_when(between(d, 0.95*b, 1.05*b) & between(e, 0.95*d, 1.05*d) ~ 'TRUE', TRUE ~ 'FALSE'))
    # A tibble: 5 x 5
    # Rowwise: 
      a         b     d     e new_col
      <chr> <dbl> <dbl> <dbl> <chr>  
    1 id1       5   5.2   5.4 TRUE   
    2 id2      10 150     0   FALSE  
    3 id3       7 123    10   FALSE  
    4 id4       2   5     3   FALSE  
    5 id5       3   7     5   FALSE  
    

    【讨论】:

      【解决方案3】:

      这就是你所追求的吗?

      a <- c('id1','id2','id3','id4','id5')
      b <- c(5,10,7,2,3)
      d <- c(5.2,150,123,5,7)
      e <- c(5.4,0,10,3,5)
      
      df1 <- data.frame(a,b,d,e)
      library(tidyverse)
      df1 %>% 
        mutate(new_col = ifelse((b >= (0.95 * d) & b <= (1.05 * d) & d >= (0.95 * e) & d <= (1.05 * e)),
                                "TRUE", "FALSE"))
      
          a  b     d    e new_col
      1 id1  5   5.2  5.4    TRUE
      2 id2 10 150.0  0.0   FALSE
      3 id3  7 123.0 10.0   FALSE
      4 id4  2   5.0  3.0   FALSE
      5 id5  3   7.0  5.0   FALSE
      

      【讨论】:

        猜你喜欢
        • 2020-05-18
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        相关资源
        最近更新 更多