2014-09-01 37 views
0

我想按行降序排列my.data [4:10]。一些線索在這裏,但我無法充分解析:Sort second to fifth column for each row in R對每行的列子集進行排序

我也嘗試過類似的事情:

sort(my.data, decreasing = TRUE, partial = c([4:10])) 

,沒有工作,但我認爲前者更符合我的需要。我通讀了?cbind,?apply,?sort幫助,但這些例子對我來說只是神祕的。

這裏是我的樣本數據集:

habitat<-c('Marsh','Prairie','Savanna','Swamp','Woodland') 
NumSites<-c(3,3,4,1,4) 
NumSamples<-c(6,5,8,2,8) 
Sp1<-c(NA,2,NA,2,1) 
Sp2<-c(NA,2,1,NA,1) 
Sp3<-c(NA,NA,NA,NA,1) 
Sp4<-c(3,NA,NA,NA,NA) 
Sp5<-c(NA,NA,3,NA,NA) 
Sp6<-c(1,NA,67,NA,2) 
Sp7<-c(NA,2,3,NA,1) 

my.data<-data.frame(habitat,NumSites,NumSamples,Sp1,Sp2,Sp3,Sp4,Sp5,Sp6,Sp7) 

# I suspect a varient of this must work: 
# cbind(df[,1], t(apply(df[,-1], 1, sort))) 

理想的結果應該是這樣的:

habitat NumSites NumSamples Sp1 Sp2 Sp3 Sp4 Sp5 Sp6 Sp7 
Marsh 3  6   3 1 NA NA NA NA NA 
Prairie 3  5   2 2 2 NA NA NA NA 
Savanna 4  8   67 3 3 1 NA NA NA 
Swamp 1  2   2 NA NA NA NA NA NA 
Woodland 4  8   2 1 1 1 1 NA NA 

我覺得像cbind方法是關閉...

而且,實際的數據有很多和不同數量的列和列名稱,所以我想使用範圍[4:10]而不是列名稱。

回答

2

This answer的做法,您在上面引述接近:

cbind(df[,1], t(apply(df[,-1], 1, sort))) 

,但它需要兩個變化:

  • 你想排除除前三列以外的所有內容,除第一列以外的所有列。因此分別將[,1][,-1]分別改爲[, 1:3][, -(1:3)]
  • 默認情況下,sort按遞增順序排序,同時您想要遞減順序,並在完全丟棄NDA的同時希望它們保持最後。您可以通過將decreasing=TRUE, na.last=TRUE參數添加到sort來解決此問題。

這使得該解決方案:

cbind(my.data[, 1:3], t(apply(my.data[, -(1:3)], 1, function(v) sort(v, decreasing=TRUE, na.last=TRUE)))) 

請注意,如果你把它分解到多行它可能是一個有點清晰:

mysort = function(v) sort(v, decreasing=TRUE, na.last=TRUE) 
sorted.cols = t(apply(my.data[, -(1:3)], 1, mysort)) 
cbind(my.data[, 1:3], sorted.cols) 
2

這似乎很好地工作:

my.data[,4:10] <- t(apply(my.data[,4:10], 1, function(x) sort(x, na.last = T, decreasing=T))) 


# habitat NumSites NumSamples Sp1 Sp2 Sp3 Sp4 Sp5 Sp6 Sp7 
#1 Marsh  3   6 3 1 NA NA NA NA NA 
#2 Prairie  3   5 2 2 2 NA NA NA NA 
#3 Savanna  4   8 67 3 3 1 NA NA NA 
#4 Swamp  1   2 2 NA NA NA NA NA NA 
#5 Woodland  4   8 2 1 1 1 1 NA NA 
+0

不需要匿名功能。如果我們正在處理數據幀,那麼在子集中不應該有逗號。 – 2014-09-01 14:20:36

2

你並不需要上一個匿名函數這個。

> my.data[4:10] <-t(apply(my.data[4:10],1,sort,decreasing = TRUE,na.last = TRUE)) 
> my.data 
# habitat NumSites NumSamples Sp1 Sp2 Sp3 Sp4 Sp5 Sp6 Sp7 
# 1 Marsh  3   6 3 1 NA NA NA NA NA 
# 2 Prairie  3   5 2 2 2 NA NA NA NA 
# 3 Savanna  4   8 67 3 3 1 NA NA NA 
# 4 Swamp  1   2 2 NA NA NA NA NA NA 
# 5 Woodland  4   8 2 1 1 1 1 NA NA