为r中数据框中的每一行选择最低5个值的组合名

时间:2017-07-18 07:58:29

标签: r

假设我有一个数据框:

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

1 个答案:

答案 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包含第二低值。

希望这有帮助!