【问题标题】:How to compare values with more or less如何将值与更多或更少进行比较
【发布时间】:2021-12-13 12:19:56
【问题描述】:

我有一个数据框,我想比较第 3 行中的变量,使用 if 语句和 more 或 less

假设我想将第三列中的相同值与或多或少的 0.2 进行比较

data >
NAME         A      B      C      D
first        3      2      4      5
second       1      2      3      4
third        7      7.1    7.5    6.9
four         2      1      0      5

这里是一个比较精确值的程序

for (i in 1:3) {
  d <- i+1
  for (j in d:4) {
    if(data [3,i] == data [3,j] ){
        print(paste("The columns" , colnames(data[,i]) ,"and " , colnames(data[,i]) , "are equal"))
    }
  }
}

在这里它会返回空值,因为程序会比较确切的值,而我想比较具有或多或少 0.2 相同值的值

我想要的结果是

the column A and B are equal  
the column A and D are equal

这是因为 A(=7) + 或 - 与 B(7.1) 相同 和 D 一样 A(=7) + 或 - D (6.9)

谢谢

【问题讨论】:

  • 您的数据的预期输出是什么?
  • 感谢您的评论,我想比较第三行,因为您可以看到 A=7 所以它等于 B (+ ou - 0.2) 并且它与 D 相同所以结果 i想要的是,A列和B列相等,A列和D列相等,我编辑了问题,请看我添加了什么,谢谢
  • 此类经常使用的问题的解决方案,1)从另一个减去一个,2)检查abs()的值是否小于(&lt;)您正在寻找的范围,例如0.2。例如类似abs(data [3,i] - data [3,j]) &lt; 0.2
  • 非常感谢

标签: r dataframe for-loop if-statement statistics


【解决方案1】:

取列的组合,然后与公差进行比较:

df1 <- read.table(text ="
NAME         A      B      C      D
first        3      2      4      5
second       1      2      3      4
third        7      7.1    7.5    6.9
four         2      1      0      5", header = TRUE)


tolerance = 0.2

cbind(df1, 
      combn(colnames(df1[, 2:5]), 2, FUN = function(x){
        paste0(x[ 1 ],
               ifelse(abs(df1[, x[ 1 ] ] - df1[, x[ 2 ] ]) <= tolerance, "=", "!="),
               x[ 2 ])
      }))


#     NAME A   B   C   D    1    2    3    4    5    6
# 1  first 3 2.0 4.0 5.0 A!=B A!=C A!=D B!=C B!=D C!=D
# 2 second 1 2.0 3.0 4.0 A!=B A!=C A!=D B!=C B!=D C!=D
# 3  third 7 7.1 7.5 6.9  A=B A!=C  A=D B!=C  B=D C!=D
# 4   four 2 1.0 0.0 5.0 A!=B A!=C A!=D B!=C B!=D C!=D

【讨论】:

    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多