1

我是这个网站和 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
4

1 回答 1

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)),按 'state'、order'time' 分组,得到 last( .N) 和 first( 1L) 'salary' 的差值。

library(data.table)
setDT(df1)[order(time), list(salary=salary[.N]- salary[1L]), by = state]

或者如果'time'和'state'是有序的,我们也可以使用duplicated'state'列得到一个逻辑索引,提取'salary'得到差值。

 salary <- with(df1, salary[!duplicated(state, fromLast=TRUE)]-
                     salary[!duplicated(state)])
 data.frame(state=unique(df1$state), salary)
于 2015-08-29T03:30:46.303 回答