查找 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
排序,然后使用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',求最后一个(.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)
我是这个网站和 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
排序,然后使用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',求最后一个(.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)