我之前问过这个问题:“
如何在r中重新排序具有多个物种的数据帧。每个物种的观测数量都不同,我需要按照降序对最终数据帧进行排序,首先列出大多数观测值的物种。在这个例子中,最终的数据框应该首先列出物种B,然后是物种C,最后是物种A.“
colA= c("C","C","C","B","B","B","B","A","A")
colB= c(1.1,2.1,3.1,4.1,5.1,6.1,7.1,8.1,9.1)
colC= c(-1.2,-2.1,-3.1,-4.1,-5.1,-6.1,-7.1,-8.1,-9.1)
df= data.frame (spp=colA, latitude=colB, longitude=colC)
df
我收到了一个很好的答案:
# add a column counting the number of rows in each species
df <- transform(df, n = ave(latitude ,spp, FUN = length))
# order by this new column
dfordered <- df[order(df$n),decreasing = TRUE]
但是现在我再次被困在制作一个物种“物种”中,其中有有序的物种名称。 现在我有:
species <- levels(df$spp)
这个命令按字母顺序放回所有内容,但我需要按“n”(记录数)排序对象。有什么建议。提前谢谢!
干杯, 以色列
答案 0 :(得分:1)
这就像使用unique
一样简单。我强迫character
以免在等级和实际值之间混淆。
unique(as.character(dfordered$spp))
要从原始数据到此处,请使用table
table(df$spp)
## A B C
## 2 4 3
您可以对此进行排序
sppCount <- table(df$spp)
names(sort(sppCount, decreasing = TRUE))
# [1] "B" "C" "A"
答案 1 :(得分:1)
如果您主要对相对丰富感兴趣,您可能还希望按频率对spp
因子进行排序。在这种情况下,使用reorder()
根据需要排列其级别,然后对data.frame进行排序,以便观察到最多的物种排在第一位。
df <- transform(df, spp = reorder(spp, spp, length))
df[order(df$spp, decreasing=TRUE),]
# spp latitude longitude
# 4 B 4.1 -4.1
# 5 B 5.1 -5.1
# 6 B 6.1 -6.1
# 7 B 7.1 -7.1
# 1 C 1.1 -1.2
# 2 C 2.1 -2.1
# 3 C 3.1 -3.1
# 8 A 8.1 -8.1
# 9 A 9.1 -9.1
## To see one advantage of reordering the factor levels
barplot(table(df$spp))