如何在循环中动态修改多个数据帧?

时间:2015-12-14 10:57:22

标签: r

我使用assign在循环内创建多个数据框,但是一旦创建它们,我该如何在同一循环中修改它们?

例如以下代码......

for(i in 1:3) {
assign(paste0("df", i),data.frame(A=c('a','b','c'),B=c("","","")))
}

创建三个数据帧,即df1,df2和df3,每个都看起来像......

  A B
1 a  
2 b  
3 c  

B栏空白。

在创建df [i]时,所需的输出是在B列中具有'i'的值。所以df2会......

  A B
1 a 2
2 b 2
3 c 2

重要提示:请注意,虽然在这种情况下我可以在assign命令本身内执行此操作,但在我正在处理的较大问题中,我需要在assign命令作为我正在创建的数据帧实际上是较大数据帧的子集,而不是新数据帧本身。

我试过......

for(i in 1:3) {
assign(paste0("df", i),data.frame(A=c('a','b','c'),B=c("","","")))
paste0("df", i)$B <- i
}

......这不起作用。什么可以取代paste0("df", i)$B <- i

2 个答案:

答案 0 :(得分:3)

我总是尽力保持我会做同样的事情。可以是数据框或列表,但它不会混乱我的全局环境,对象操作也更容易。

###create some data

set.seed(123)
nobs=100
dat <- data.frame(id=1:nobs,x=rnorm(nobs),y=runif(nobs))

n_subsets = 3
percentages = c(50,30,20)

#create sample_flags: list of 'labels', with
#each label being x percent of total

subset_labels <- sprintf("%.f%%",percentages)
subset_flags <- sample(rep(subset_labels , times=percentages*nrow(dat)/100))

#or, depending on larger problem
#subset_flags <- sample(subset_labels, size=nrow(dat), prob=percentages/100, replace=T)

#(might not work nicely with all numbers of obs, but I'm guessing you've solved that)

#random part
dat$mysubset <- subset_flags

#do stuff for each subset, like mean of y orcount
library(data.table)

setDT(dat)[,.(.N, meany=mean(y)),mysubset]

> setDT(dat)[,.(.N, meany=mean(y)),mysubset]
   mysubset  N     meany
1:      30% 30 0.5632690
2:      50% 50 0.4717880
3:      20% 20 0.405884

或者如果你真的想要一个清单

mylist  <- lapply(1:3,function(x){
  data.frame(A=c('a','b','c'),B=c("","",""))
}
)
mylist <- lapply(1:3, function(i){
  r <- mylist[[i]]
  r$i <- i
  r
})

答案 1 :(得分:2)

正如评论所说,这是一个使用列表的好机会(基于给出的有限信息)。

我会:

l = lapply(1:3, function(i){
   data.frame(A=c("a", "b", "c"), B=i)
})

如果您不想分别指定B列:

l = lapply(1:3, function(i){
   x = data.frame(A=c("a", "b", "c"))
   x$B = i
   x
})

作为旁注,我不确定您从assign获得了什么好处,所以我没有将其包含在我的示例中。