R 根据一定条件,将不同年份变量的差异归属于新列中

R 根据一定条件,将不同年份变量的差异归属于新列中,r,for-loop,try-catch,rstudio,R,For Loop,Try Catch,Rstudio,我有一个称为df的数据帧,如下所示: country year taxrevenue VAT CIT Angola 2006 1000 750 250 Albania 1998 1000 750 250 Albania 2002 1500 1125 375 Albania 2005 1200 900 300 Argentina 1984 1900

我有一个称为df的数据帧,如下所示:

country     year    taxrevenue  VAT  CIT
Angola      2006    1000        750  250
Albania     1998    1000        750  250
Albania     2002    1500        1125 375
Albania     2005    1200         900 300
Argentina   1984    1900        1425 475
Argentina   1991    1400        1050 350
Argentina   1995    1600        1200 400
我想做的是为每个税列创建一个额外的列,该列包含一年的税收和下一年的税收之间的差额,条件是它是同一个国家,如下所示:

country     year    dtaxrevenue dvat    dcit
Angola      2006      NA          NA      NA
Albania     1998      NA          NA      NA
Albania     2002     500         375     125
Albania     2005    -300        -225     -75
Argentina   1984      NA         525     175
Argentina   1991    -500        -375    -125
Argentina   1995     200         150      50
我的想法如下:

#for each column in df
for(i in 1:ncol(TRcomplete)){
#add a new column
TRcomplete <- cbind(TRcomplete[,i])
# When condition holds..
if(TRcomplete$year[,i]- TRcomplete$year[,i+1] < 0) & TRcomplete$country[,i] == TRcomplete$country[,i+1]{
# try to subtract two values and put them in a new column
try(TRcomplete[,i+1] <- TRcomplete[,i]- TRcomplete[,i+1]
} else {
TRcomplete[,i+1]<-NA
}
我对如何引用每一列感到困惑。有人能提供帮助吗?

使用dplyr我们可以试试

library(dplyr)
df %>% group_by(country) %>% 
       mutate(Tax = taxrevenue-lag(taxrevenue))


  # A tibble: 7 x 6
  # Groups:   country [3]
  country    year taxrevenue   VAT   CIT   Tax
  <chr>     <int>      <int> <int> <int> <int>
1 Angola     2006       1000   750   250    NA
2 Albania    1998       1000   750   250    NA
3 Albania    2002       1500  1125   375   500
4 Albania    2005       1200   900   300  -300
5 Argentina  1984       1900  1425   475    NA
6 Argentina  1991       1400  1050   350  -500
7 Argentina  1995       1600  1200   400   200
使现代化
一个版本包含data.table

# make data
library(data.table)
dt <- data.table(
    country = c("Angola", "Albania", "Albania", "Albania", "Argentina", "Argentina", "Argentina"),
    year    = c(2006, 1998, 2002, 2005, 1984, 1991, 1995),
    tax     = c(1000, 1000, 1500, 1200, 1900, 1400, 1600),
    vat     = c(750,   750, 1125,  900, 1425, 1050, 1200),
    cit     = c(250,   250,  375,  300,  475,  350,  400)
)

# get lagged taxes
dt <- dt[order(country, year)]
dt[ , lag_tax := shift(tax), by=country]
dt[ , lag_vat := shift(vat), by=country]
dt[ , lag_cit := shift(cit), by=country]

# calculate tax differences
dt[ , dtax := tax - lag_tax]
dt[ , dvat := vat - lag_vat]
dt[ , dcit := cit - lag_cit]
突变是候选者

图书馆弹琴 df%>% arrangecountry,年份%>%排序数据 按国家/地区划分的组%>% mutate_atvarstaxrevenue:CIT,funsd=。-缓慢移动 给

  country    year taxrevenue   VAT   CIT taxrevenue_d VAT_d CIT_d
1 Albania    1998       1000   750   250           NA    NA    NA
2 Albania    2002       1500  1125   375          500   375   125
3 Albania    2005       1200   900   300         -300  -225  - 75
4 Angola     2006       1000   750   250           NA    NA    NA
5 Argentina  1984       1900  1425   475           NA    NA    NA
6 Argentina  1991       1400  1050   350         -500  -375  -125
7 Argentina  1995       1600  1200   400          200   150    50
样本数据:


根据您的预期产出,您要查找的是一年的税收与上一年的税收之间的差异,而不是一年的税收与下一年的税收之间的差异。对吗?在你想要的结果中,为什么阿根廷的dtaxrevenue=700?事实上,与之前的相比。。谢谢你注意到这个错误Dan Yth工作得很好。非常感谢你的帮助!您知道如何将最后一行扩展到整个df的更通用解决方案吗?非常欢迎。您可以尝试列出mutate中的所有变量,如mutateTax=taxrevenue lagtaxrevenue,VAT=VAT lagVAT。。。或者在@Prem answer中使用mtate_,这是我们的pleasure@TomKisters只需从链中删除所选年份%>%。选择DX从DF选择列,而选择X选择DF中的所有列,除了席将坚持只删除选择年%%%HHA;如果我决定使用插值,那么这一年可能会派上用场!非常感谢,刚刚测试过,效果非常好。我的df中有非数字列??mutate_如果没有确切的建议,你可能需要共享dputdf。这可能是个愚蠢的问题,但是?mutate_如果去哪里?我的意思是,它不应该替换右边的mutate_?尝试在varstaxRevenue:CIT,funsas.numericas.character中添加mutate_.%>%作为第二行,即在我的回答中的“安排”语句之前,您应该可以开始了。我正在修补此解决方案,因为下面建议的解决方案删除了我需要的一列。它可以工作,但我得到了所有这些警告7:警告消息:1:在evalqas.numericas.characterconsolidated_变量中,强制引入的:NAs。我可以忽略这些吗?谢谢你的回答,很抱歉反应太晚。是否有可能将这个答案推广到一个大型数据集?如何?当前的解决方案适用于包含更多国家和年份的数据集。我的意思是,出于各种原因,我不喜欢单独键入超过150个的每一列,而是告诉它为每一列创建一个滞后变量。类似于:df[,3:ncoldf]的内容参见上文答案的补充
# get lagged cols
dt[ , paste0(names(dt)[3:5], "_lag") := lapply(.SD, shift), by=country, .SDcols=3:5]

# or go straight to differences
dt[ , paste0(names(dt)[3:5], "_diff") := lapply(.SD, function(x) x - shift(x)), by=country, .SDcols=3:5]
  country    year taxrevenue   VAT   CIT taxrevenue_d VAT_d CIT_d
1 Albania    1998       1000   750   250           NA    NA    NA
2 Albania    2002       1500  1125   375          500   375   125
3 Albania    2005       1200   900   300         -300  -225  - 75
4 Angola     2006       1000   750   250           NA    NA    NA
5 Argentina  1984       1900  1425   475           NA    NA    NA
6 Argentina  1991       1400  1050   350         -500  -375  -125
7 Argentina  1995       1600  1200   400          200   150    50
df <- structure(list(country = c("Angola", "Albania", "Albania", "Albania", 
"Argentina", "Argentina", "Argentina"), year = c(2006L, 1998L, 
2002L, 2005L, 1984L, 1991L, 1995L), taxrevenue = c(1000L, 1000L, 
1500L, 1200L, 1900L, 1400L, 1600L), VAT = c(750L, 750L, 1125L, 
900L, 1425L, 1050L, 1200L), CIT = c(250L, 250L, 375L, 300L, 475L, 
350L, 400L)), .Names = c("country", "year", "taxrevenue", "VAT", 
"CIT"), class = "data.frame", row.names = c(NA, -7L))