R 根据一定条件,将不同年份变量的差异归属于新列中
我有一个称为df的数据帧,如下所示: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
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))