使用过滤器在不同变量的数据框中进行提供

时间:2015-04-29 13:02:05

标签: r dataframe lapply

我正在尝试计算数据框中的几个新变量。取初始值,例如:

说我有:

Dataset <- data.frame(time=rep(c(1990:1992),2),
           geo=c(rep("AT",3),rep("DE",3)),var1=c(1:6), var2=c(7:12))

        time    geo var1 var2
1       1990    AT  1    7
2       1991    AT  2    8
3       1992    AT  3    9
4       1990    DE  4   10
5       1991    DE  5   11
6       1992    DE  6   12

我想要:

        time    geo  var1  var2  var1_1990  var1_1991  var2_1990 var2_1991
1       1990    AT   1     7      1          2          7         8
2       1991    AT   2     8      1          2          7         8
3       1992    AT   3     9      1          2          7         8
4       1990    DE   4     10     4          5          10        11
5       1991    DE   5     11     4          5          10        11
6       1992    DE   6     12     4          5          10        11

因此,新变量的时间和变量都在变化。这是我的尝试:

intitialyears <- c(1990,1991)
intitialvars <- c("var1", "var2") 
# ideally, I want code where I only have to change these two vectors 
# and where it's possible to change their dimensions

for (i in initialyears){
lapply(initialvars,function(x){
rep(Dataset[time==i,x],each=length(unique(Dataset$time)))
})}

哪个运行没有错误但没有产生任何结果。我想在示例中分配变量名称(例如“var1_1990”)并立即使新变量成为数据帧的一部分。我也想避免for循环,但我不知道如何围绕这个函数包装两个lapply。我宁愿让函数使用两个参数吗? apply函数没有将结果带入我的环境的问题是什么?我已经被困在这里一段时间了,所以我会感激任何帮助!

p.s。:我有解决方案,通过组合无需申请和喜欢这样的组合,但我正试图摆脱复制和粘贴:

Dataset$var1_1990 <- c(rep(Dataset$var1[which(Dataset$time==1990)],
                      each=length(unique(Dataset$time))))

1 个答案:

答案 0 :(得分:4)

可以使用subset()reshape()merge()完成此操作:

merge(Dataset,reshape(subset(Dataset,time%in%c(1990,1991)),dir='w',idvar='geo',sep='_'));
##   geo time var1 var2 var1_1990 var2_1990 var1_1991 var2_1991
## 1  AT 1990    1    7         1         7         2         8
## 2  AT 1991    2    8         1         7         2         8
## 3  AT 1992    3    9         1         7         2         8
## 4  DE 1990    4   10         4        10         5        11
## 5  DE 1991    5   11         4        10         5        11
## 6  DE 1992    6   12         4        10         5        11

列顺序并不完全与您的问题有关,但如果需要,您可以使用索引操作在事后解决该问题。