我需要通过组合,聚合和拆分数据帧来执行各种操作。这些行动需要连续几年重复(2000年,2001年,2002年等)。但是,我找不到基于带有年份的循环字符串来引用多个数据帧的方法。
一个例子: 我想要结合同一年的3个数据帧。我目前的代码:
Stake_2000 <- combine(A2000, B2000, C2000)
Stake_2001 <- combine(A2001, B2001, C2001)
Stake_2002 <- combine(A2002, B2002, C2002)
Stake_2003 <- combine(A2003, B2003, C2003)
Stake_2004 <- combine(A2004, B2004, C2004)
Stake_2005 <- combine(A2005, B2005, C2005)
我想通过在循环中用变量替换年份来简化。但是,我无法让R从相应的数据帧中读取。我陷入了多次尝试:
names <- c("2000", "2001", "2002", "2003", "2004", "2005")
for (n in names)
{Temp <- combine(c("A",n,sep=""), (c"B",n,sep=""), c("C",n,sep=""))
assign(paste("Stake_",n,sep=""), Temp)}
or replace combine function with combine(An, Bn, Cn), or combine(A+n, B+n, C+n)
除了这些行动之外,我还需要对来自不同数据库的聚合和匹配进行多年来的类似问题。例如,将所有“2000”替换为循环中的后续年份:
Temp <- aggregate(VarA~VarB, data=A_2000, FUN=length)
S_2000$VarC <- Temp[match(S_2000$ID, Temp$ID), "VarA"]
我认为它有一些很直接的答案,但我找不到它。
答案 0 :(得分:1)
你可以尝试
library(dplyr)
names <- c("2000", "2001", "2002", "2003", "2004", "2005")
for(n in names){
Temp <- bind_cols( get(paste0('A', n)), get(paste0('B', n)),
get(paste0('C', n)))
assign(paste0('Stake_', n), Temp)
}
identical(cbind(A2000, B2000, C2000), Stake_2000)
#[1] TRUE
identical(cbind(A2005, B2005, C2005), Stake_2005)
#[1] TRUE
对于aggregate
,您可以
lapply(mget(paste0('A', 2000:2005)), function(x)
aggregate(V1~V2, x, FUN=length))
同样适用于B
和C
,但不清楚S_2000
是什么。
如果行数不同,我们可以combine
使用stri_list2matrix
来自stringi
A2000 <- rbind(A2000, c(4,8, 9 , 15, 25))
library(stringi)
for(n in names){
Temp <- as.data.frame(stri_list2matrix(combine( get(paste0('A', n)),
get(paste0('B', n)), get(paste0('C', n)))), stringsAsFactors=FALSE)
Temp[] <- lapply(Temp, as.numeric)
assign(paste0('Stake_', n), Temp)
}
Stake_2000
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15
#1 6 19 12 18 1 1 18 5 7 17 9 19 12 18 8
#2 4 5 7 4 11 12 9 1 2 5 4 13 18 5 6
#3 14 16 14 0 15 3 7 13 20 0 4 3 0 0 6
#4 10 16 14 10 2 4 10 6 13 16 4 2 6 8 15
#5 13 5 6 2 4 12 11 0 10 16 9 17 12 7 6
#6 4 8 9 15 25 NA NA NA NA NA NA NA NA NA NA
set.seed(24)
list2env(setNames(lapply(1:6, function(i)
as.data.frame(matrix(sample(0:20, 5*5, replace=TRUE), ncol=5))),
paste0('A', 2000:2005)), envir=.GlobalEnv)
list2env(setNames(lapply(1:6, function(i)
as.data.frame(matrix(sample(0:20, 5*5, replace=TRUE), ncol=5))),
paste0('B', 2000:2005)), envir=.GlobalEnv)
list2env(setNames(lapply(1:6, function(i)
as.data.frame(matrix(sample(0:20, 5*5, replace=TRUE), ncol=5))),
paste0('C', 2000:2005)), envir=.GlobalEnv)