R - tapply的结果总是按字母顺序排列

时间:2015-02-09 15:00:27

标签: r tapply

我使用dataframe df

Name = c("Albert", "Caeser", "Albert", "Frank")
Earnings = c(1000,2000,1000,5000)
df = data.frame(Name, Earnings)


Name        Earnings

Albert      1000
Caesar      2000
Albert      1000
Frank       5000

如果我使用tapply函数

result <- tapply(df$Earnings, df$Name, sum)

我得到此表结果

Albert  2000
Caeser  2000
Frank   5000

在任何情况下,表格&#34;结果&#34;如果我使用如上所述的tapply函数,则不会按字母顺序排序?

当我试图找到答案时,我改变了行的顺序:

Name        Earnings
Frank       5000
Caeser      2000
Albert      1000
Albert      1000

但仍然得到相同的结果。

我使用多个函数,我用tapply计算的输出计算,我必须绝对确定,输出始终以相同的顺序传递。

2 个答案:

答案 0 :(得分:1)

通常输出是有序的,但你可以提出不是的例子。例如,如果您有无序级别的因子。

df <- data.frame(Name = factor(c('Ben', 'Al'), levels = c('Ben', 'Al')),  
                 Earnings = c(1, 4))
tapply(df$Earnings, df$Name, sum)
## Ben  Al 
##   1   4 

在这种情况下,您可以使用as.character或(可能是保护程序)对结果进行排序。

tapply(df$Earnings, as.character(df$Name), sum)
##  Al Ben 
##   4   1 

result <- tapply(df$Earnings, df$Name, sum)
result[order(names(result))]
##  Al Ben 
##   4   1 

另一个可能的问题可能是前导空格:

df <- data.frame(Name = c(' Ben', 'Al'),  
                 Earnings = c(1, 4))
tapply(df$Earnings, df$Name, sum)
##  Ben   Al 
##    1    4 

在这种情况下,只需删除所有前导空格即可获得排序结果。

答案 1 :(得分:0)

您可以在R中订购任何数组时订购sapply输出。使用[sort]命令。1

> result
Albert Caeser  Frank 
  2000   2000   5000 

> sort(result,decreasing=TRUE)
 Frank Albert Caeser 
  5000   2000   2000 

根据您要订购的内容,您可以按上面所示对值进行排序(将decreasing保留为NULL,即sort(result)您将按递增顺序获取值),或者排序姓名:

这将按反向字母顺序按name传递结果     result[sort(names(result),decreasing=TRUE)]

 Frank Caeser Albert 
  5000   2000   2000 

您还想要排序和订购什么?