我是这个网站和R语言的新手,这是我的第一个问题:)
我正在分析美国人在不同年份和不同州的工资数据(总共30个标记为1,2,......,30)。起始年份完全相同(1970年),但结束年份各不相同(从1990年到2000年)。对于每个州,我希望找到结束年份和起始年份的薪水之间的差异。我写了以下内容,但它不起作用:
for (i in 1:30) {
salarygrowth <- function(salary[state == "i", time == max(1990:2000, na.rm=FALSE)], salary[state == "i", time == 1970]) {
salary[state == "i", time == max(1990:2000, na.rm=FALSE)] - salary[state == "i", time == 1970]}
}
我如何能够修复和改进它,以便我可以为每个州提供所需的年薪。 非常感谢提前!
根据需要,以下是一些数据:
time state salary
1970 1 27890
1971 1 28800
1972 1 31257
1973 1 32846
...
1995 1 58934
1970 2 26783
1971 2 28987
...
1997 2 67998
1970 3 21349
...
1992 3 56212
...
2000 30 67876
答案 0 :(得分:2)
我们可以使用群组功能进行聚合。一个选项是dplyr
。我们按“州”进行评分,并将“最大'时间'对应的”工资“与最小”时间“区分开来
library(dplyr)
df1 %>%
group_by(state) %>%
summarise(salary = salary[which.max(time)]- salary[which.min(time)])
如果“时间”列未订购,我们会按arrange
订购,然后使用first
,last
提取工资的第一个,最后一个值,然后选择差。
df1 %>%
group_by(state) %>%
arrange(time) %>%
summarise(salary=last(salary)- first(salary))
或者使用data.table
,我们将'data.frame'转换为'data.table'(setDT(df1)
),按'州',order
按'时间'分组,获取最后一个(.N
)和第一个(1L
)'工资'的差异。
library(data.table)
setDT(df1)[order(time), list(salary=salary[.N]- salary[1L]), by = state]
或者如果订购'时间'和'状态',我们也可以在'州'列上使用duplicated
来获取逻辑索引,提取'薪水'以获得差异。
salary <- with(df1, salary[!duplicated(state, fromLast=TRUE)]-
salary[!duplicated(state)])
data.frame(state=unique(df1$state), salary)