【问题标题】:How to calculate vector pairwise comparisons using ifesle function如何使用 ifesle 函数计算向量成对比较
【发布时间】:2021-12-17 22:16:45
【问题描述】:

我需要计算许多变量的所有成对差异(我的数据集中有 100 个)。 如果 abs 差异 > 1,则应显示为 1,否则结果应为 0。 然后我想总结每个成对比较的 1 和 0 值,并将它们排列成一个矩阵。 我尝试了以下代码,但出现错误消息。

 juan<-outer(seq_along(rio_csv), seq_along(rio_csv), FUN =
  Vectorize(function(i, j)(sum(ifelse(abs(rio_csv[[i]]-rio_csv[[j]]))>1,1,0))))

虽然该操作适用于两列。

> (pri<-sum(ifelse(abs(rio_csv$V1-rio_csv$V2)>1,1,0)))

数据

感谢您的帮助。

【问题讨论】:

  • 请提供一些样本数据 - 内置数据集(例如,mtcars,如果“足够接近”)或真实数据的复制/可粘贴样本(例如,dput(rio_csv[1:6, 1:5]) 表示前 5 列的前 6 行)。
  • 另外,请不要说“有错误消息”,而是将错误消息放在您的问题中。它们通常非常有用。
  • 至于你的报错信息,好像是放错了)。将(sum(ifelse(abs(rio_csv[[i]]-rio_csv[[j]]))&gt;1,1,0)))) 更改为(sum(ifelse(abs(rio_csv[[i]]-rio_csv[[j]])&gt;1,1,0)))))
  • 作为一个小提示,您可以将summean TRUE/FALSE 值视为 1,将 FALSE 视为 0,因此您的代码中不需要 ifelse。您可以简化为sum(abs(rio_csv[[i]] - rio_csv[[j]]) &gt; 1)

标签: r if-statement


【解决方案1】:

这样的事情怎么样:

a = 3*runif(100) # I'm just randomizing values, your dataset should come here

b = expand.grid(a,a) #also 'merge' would work
b$digital = 0
b$digital[abs(b[,1]-b[,2])>1] = 1 
result = b$digital

我不知道您将值放入矩阵是什么意思,但 0/1 值在结果变量中(仍然是向量形式)。 这绝不是最简单和最流畅的解决方案,只是一个快速的解决方案:) 另外我没有使用 ifelse 函数,但是 abs(b[,1]-b[,2])>1 是一个布尔向量,最终结果与 ifelse 函数相同..

【讨论】:

    【解决方案2】:

    使用mtcars 作为示例数据,我会这样做:

    data = mtcars
    
    col_pairs = combn(names(data), 2, simplify = TRUE)
    
    counts = apply(col_pairs, MARGIN = 2, function(x) sum(abs(data[[x[1]]] - data[[x[2]]]) > 1))
    
    result = matrix(
      NA,
      nrow = ncol(data), ncol = ncol(data),
      dimnames = list(names(data), names(data))
    )
    
    result[t(col_pairs)] = counts
    result
    #      mpg cyl disp hp drat wt qsec vs am gear carb
    # mpg   NA  32   32 32   32 32   27 32 32   32   32
    # cyl   NA  NA   32 32   21 30   32 32 32   20   30
    # disp  NA  NA   NA 32   32 32   32 32 32   32   32
    # hp    NA  NA   NA NA   32 32   32 32 32   32   32
    # drat  NA  NA   NA NA   NA 16   32 32 32    3   19
    # wt    NA  NA   NA NA   NA NA   32 28 28   17   19
    # qsec  NA  NA   NA NA   NA NA   NA 32 32   32   32
    # vs    NA  NA   NA NA   NA NA   NA NA  0   32   20
    # am    NA  NA   NA NA   NA NA   NA NA NA   32   21
    # gear  NA  NA   NA NA   NA NA   NA NA NA   NA   14
    # carb  NA  NA   NA NA   NA NA   NA NA NA   NA   NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2022-08-07
      • 2013-03-15
      • 1970-01-01
      相关资源
      最近更新 更多