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

R - Is the result of tapply always in alphabetical order

我使用数据框 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)

我得到这个table结果

Albert  2000
Caeser  2000
Frank   5000

如果我使用上述的 tapply 函数,在什么情况下 table "result" 不会按字母顺序排列?

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

Name        Earnings
Frank       5000
Caeser      2000
Albert      1000
Albert      1000

但仍然得到相同的结果。

我使用了多个函数,其中我使用 tapply 计算的输出进行计算,我必须绝对确定输出始终以相同的顺序交付。

您可以像在 R 中订购任何数组一样订购 sapply 输出。使用 [sort] command.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 

您还想根据什么进行排序和排序?

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

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 

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