我有一个数据框。我想计算每行与给定行的“距离”。让我们考虑第1行。设数据框如下:
> sampleDF
X1 X2 X3
1 5 5
4 2 2
2 9 1
7 7 3
我希望做的是:
sampleDF[1,]-sampleDF[2,]
abs(sampleDF[1,]-sampleDF[2,])
rowSums(newDF)
现在为整个数据框执行此操作。
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行的“距离”。还需要为其他行执行此操作)?运行循环是唯一的选择吗?
答案 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,])))
应该解决它。