查找 r 中分类数据的差异

Find difference of categorical data in r

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

我们可以使用按组聚合函数来做到这一点。一种选择是 dplyr。我们按 'state' 分组,得到最大 'time' 对应的 'salary' 与最小 'time'

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

另一种选择,如果'time'列没有排序,我们按arrange排序,然后使用firstlast提取第一个,最后一个值工资取差价

df1 %>%
   group_by(state) %>%
   arrange(time) %>%
   summarise(salary=last(salary)- first(salary)) 

或使用data.table,我们将'data.frame'转换为'data.table'(setDT(df1)),按'state'分组,order按'time',求最后一个(.N)和第一个(1L)的差'salary'.

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

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

 salary <- with(df1, salary[!duplicated(state, fromLast=TRUE)]-
                     salary[!duplicated(state)])
 data.frame(state=unique(df1$state), salary)