如何在R

时间:2019-04-22 16:52:34

标签: r dataframe

我有一个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

3 个答案:

答案 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