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
在这种情况下,只需删除所有前导空格即可对结果进行排序。
我使用数据框 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
在这种情况下,只需删除所有前导空格即可对结果进行排序。