我有一个csv
文件,其中行1-5
代表一个州,5-10
代表另一州,依此类推...我还有一列,其中每个州都重复年份1970,1980,..,2010
。在R
中(尽管我不反对使用Excel解决方案,如果这样更简单),我希望每个州都可以计算出该年与1970年之间的百分比差异,即对于Alabama 1990
(AL 1990 - AL 1970)/(AL 1970)
,并将其添加到数据表的新列中,以便将其导出到csv
。
State, Year, Num
AL, 1970, 1
AL, 1980, 2
AL, 1990, 3
AL, 2000, 4
AL, 2010, 6
输出将是一列
pct_change
0
1
2
3
5
答案 0 :(得分:3)
dplyr
软件包包括函数first
,该函数提供了一种简单的方法来获取组的第一个值。因此,如果我们按Year
进行排列,以使1970年成为每个组的第一个值,那么当我们group_by(State)
时,我们可以使用first(Num)
获得第一个值{{1 }}代表1970年的值:
Num
答案 1 :(得分:1)
我们可以使用slice
。将'data.frame'转换为'data.table'(var x = '';
console.log('#' + x.slice(-1) + '#');
console.log('#' + x[x.length -1] + '#');
),按{State将data.table
转换为setDT(df)
中的'Year',按'State'分组,得到'Num'与{Num'的order
值的差异,并分配(i
)来创建'perc_diff'
first
或使用:=
library(data.table)
setDT(df)[order(State, Year), perc_diff :=
100 * (Num - first(Num))/first(Num), State][]
# State Year Num perc_diff
# 1: AL 1970 1 0
# 2: AL 1980 2 100
# 3: AL 1990 3 200
# 4: AL 2000 4 300
# 5: AL 2010 6 500
# 6: TX 1970 5 0
# 7: TX 1980 2 -60
# 8: TX 1990 10 100
# 9: TX 2000 12 140
#10: TX 2010 6 20
base R
答案 2 :(得分:0)
使用R
的基础tapply
解决方案
df <- df[with(df, order(State, Year)), ]
df$pct_change <- unlist( tapply(df$Num, df$State, function(x) 100 * (x - x[1]) / x[1]) )
> df
State Year Num pct_change
1 AL 1970 1 0
2 AL 1980 2 100
3 AL 1990 3 200
4 AL 2000 4 300
5 AL 2010 6 500
6 TX 1970 5 0
7 TX 1980 2 -60
8 TX 1990 10 100
9 TX 2000 12 140
10 TX 2010 6 20