我想按行按降序排序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 help,但这些例子对我来说只是神秘莫测。
这是我的样本数据集:
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]而不是列名。
答案 0 :(得分: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
答案 1 :(得分:2)
This answer方法很接近:
cbind(df[,1], t(apply(df[,-1], 1, sort)))
但需要进行两项更改:
[,1]
和[,-1]
更改为[, 1:3]
和[, -(1:3)]
。sort
按需增加顺序进行排序,然后完全删除NAs,而最后需要它们。您可以通过将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 :(得分: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