找出r中分类数据的差异

时间:2015-08-29 03:19:57

标签: r categorical-data date-difference

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

1 个答案:

答案 0 :(得分:2)

我们可以使用群组功能进行聚合。一个选项是dplyr。我们按“州”进行评分,并将“最大'时间'对应的”工资“与最小”时间“区分开来

library(dplyr)
df1 %>%
  group_by(state) %>%
  summarise(salary = salary[which.max(time)]- salary[which.min(time)])

如果“时间”列未订购,我们会按arrange订购,然后使用firstlast提取工资的第一个,最后一个值,然后选择差。

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)