我使用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
?
答案 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
获得了什么好处,所以我没有将其包含在我的示例中。