计算数据帧中行之间的差异

时间:2014-04-06 14:55:02

标签: r

我有一个数据框。我想计算每行与给定行的“距离”。让我们考虑第1行。设数据框如下:

> sampleDF  

   X1  X2  X3  
   1   5   5  
   4   2   2  
   2   9   1  
   7   7   3  

我希望做的是:

  1. 计算第1行和第1行之间的差异其他人:sampleDF[1,]-sampleDF[2,]
  2. 仅考虑绝对值:abs(sampleDF[1,]-sampleDF[2,])
  3. 计算新形成的差异数据框的总和:rowSums(newDF)
  4. 现在为整个数据框执行此操作。

    newDF <- sapply(2:4,function(x) { return (abs(sampleDF[1,]-sampleDF[x,]));})

    这会产生一个问题,即结果是转置列表。因此,

    newDF <- as.data.frame(t(sapply(2:4,function(x) { return (abs(sampleDF[1,]-sampleDF[x,]));})))

    但是计算rowSums时出现了另一个问题:

    > class(newDF)
    [1] "data.frame"
    > rowSums(newDF)
    Error in base::rowSums(x, na.rm = na.rm, dims = dims, ...) : 
      'x' must be numeric
    > newDF
      X1 X2 X3
    1  3  3  3
    2  1  4  4
    3  6  2  2
    > 
    

    拼图1 :为什么会出现此错误?我注意到newDF [1,1]是一个列表&amp;不是数字。是因为那个吗?我怎样才能确保和谐的结果? transpose是一个简单的数字数据框?

    所以我继续创建一个全球数据框架&amp;在函数中修改它:

    sapply(2:4,function(x) { newDF <<- as.data.frame(rbind(newDF,abs(sampleDF[1,]-sampleDF[x,])));})

    > newDF
      X1 X2 X3
    2  3  3  3
    3  1  4  4
    4  6  2  2
    > rowSums(outDF)
     2  3  4 
     9  9 10 
    > 
    

    这是预期的。

    益智2 :有更简洁的方法来实现这一目标吗?如何对数据框中的每一行执行此操作(上面显示的仅适用于第1行的“距离”。还需要为其他行执行此操作)?运行循环是唯一的选择吗?

1 个答案:

答案 0 :(得分:1)

用文字表示,你试图计算曼哈顿距离:

dist(sampleDF, method = "Manhattan")
#    1  2  3
# 2  9      
# 3  9 10   
# 4 10  9  9

关于你的实现,我认为问题是你的内部函数在返回数字向量时返回data.frame。做return(unlist(abs(sampleDF[1,]-sampleDF[x,])))应该解决它。