如果它在 r 中的不同列之间紧密匹配,则返回真值

Roh*_*ali 7 r

数据如下:

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)
Run Code Online (Sandbox Code Playgroud)

我想在这个数据框中创建一个返回 TRUE 和 FALSE 的新列。如果所有值彼此相差在 5% 以内,则为真,否则为假。

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

期望输出

在此处输入图片说明

Sur*_*ren 7

这看起来是最小值的 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
Run Code Online (Sandbox Code Playgroud)

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

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


Kar*_*k S 3

这是否有效:

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  
Run Code Online (Sandbox Code Playgroud)