假设我有一个数据框:
df=df=data.frame('var1'=c(1,3,5,7),'var2'=c(4,6,8,10),var3=c(11,12,13,14))
df
var1 var2 var3
1 4 11
3 6 12
5 8 13
7 10 14
现在,我正在使用var1&计算每行与每隔一行的距离。 VAR2
library(fields)
df_dist=df_dist=rdist(df[,1:2])
df_dist
1 2 3 4
1 0.000000 2.828427 5.656854 8.485281
2 2.828427 0.000000 2.828427 5.656854
3 5.656854 2.828427 0.000000 2.828427
4 8.485281 5.656854 2.828427 0.000000
现在我的目标是从每一行中选择两个具有该行中最低值的列(不包括0,即距离自身的距离),因此对于row1,输出应为colname = 2& 3,类似于row2,输出应为1& 3等。
我能够使用for循环执行此操作,但是对于大型数据集需要花费大量时间,使用apply,lapply等有更好的方法可以节省这个时间。
for循环代码如下:
d=as.data.frame(df_dist)
#Setting the column and row names as var3 values
colnames(d)<-df$var3
rownames(d)<-df$var3
#Intitialiazing variable e
e<-NULL
for (i in 1:nrow(d))
{
tmp=colnames(d)[order(d[i,], decreasing=FALSE)][2:3]
e<-rbind(e,tmp)
}
f=as.data.frame(e)
rownames(f)<-df$var3
答案 0 :(得分:0)
这似乎有效:
df = read.table(text="1 2 3 4
1 0.000000 2.828427 5.656854 8.485281
2 2.828427 0.000000 2.828427 5.656854
3 5.656854 2.828427 0.000000 2.828427
4 8.485281 5.656854 2.828427 0.000000")
t(apply(df,1,function(x) colnames(df)[order(x)[2:3]] ))
输出:
[,1] [,2]
1 "X2" "X3"
2 "X1" "X3"
3 "X2" "X4"
4 "X3" "X2"
因此对于row4,列X3包含最低值,X2包含第二低值。
希望这有帮助!