我正在尝试创建一堆数据帧,&在循环中修改这些数据帧中的变量。 几乎下面的代码可以工作,除了它创建了一大堆df_1$x_cs
,df_1$yx_cs
形式的对象.....我想要的是5个数据帧,像往常一样附上$元素。
nl<-seq(1,5)
for (i in nl) {
assign(paste0("df_",nl[i]),data.frame(x=seq(1:10),y=rnorm(10)))
}
ls()[grep("df_",ls())]
nls<-ls()[grep("df_",ls())]
for (df in nls) {
print(df)
for (var in names(get(df))) {
print(var)
assign(paste0(df,"$",paste0(var,"_cs")),cumsum(get(df)[[var]]))
}
}
ls()[grep("df_",ls())]
谢谢!
答案 0 :(得分:1)
以下是如何将代码翻译为使用list
来执行此操作,而不是全局环境中的名称:
lst <- list()
for (i in seq(1,5)) {
lst[[i]] <- data.frame(x=seq(1:10),y=rnorm(10))
}
lst <- lapply(lst, function(temp) {
for (var in names(temp)) {
temp[[paste0(var,"_cs")]]<-cumsum(temp[[var]])
}
return(temp)
})
summary(lst[[1]])
## x y x_cs y_cs
## Min. : 1.00 Min. :-2.7610 Min. : 1 Min. :-5.004
## 1st Qu.: 3.25 1st Qu.:-1.4388 1st Qu.: 7 1st Qu.:-2.652
## Median : 5.50 Median :-0.7308 Median :18 Median :-1.656
## Mean : 5.50 Mean :-0.4338 Mean :22 Mean :-1.908
## 3rd Qu.: 7.75 3rd Qu.: 0.7028 3rd Qu.:34 3rd Qu.:-1.207
答案 1 :(得分:-1)
非常感谢Blaser Nello在R-Help列表中解决这个问题。我认为最好分享答案。
以下是两种可能的方法:
这会简化你的代码。但它改变了x_cs的名称 到cs.x。
for (df in nls) {
assign(df, cbind(get(df), cs=apply(get(df), 2, cumsum)))
}
这更接近你所做的。
for (df in nls) {
print(df)
for (var in names(get(df))) {
print(var)
assign(df, within(get(df), assign(paste0(var,"_cs"),
cumsum(get(df)[[var]]))))
}}
ls()[grep("df_",ls())]
答案 2 :(得分:-1)
我发现了一种更简单,更清晰的方法,我认为这将是我未来的目标。这非常有效:
for (i in seq(1,5)) {
assign(paste0("df_",i),data.frame(x=seq(1:10),y=rnorm(10)))
rm(i)
}
nls<-ls()[grep("df_",ls())]
for (df in nls) {
temp<-get(df)
for (var in names(temp)) {
temp[[paste0(var,"_cs")]]<-cumsum(temp[[var]])
}
assign(df, temp)
rm(var,df,temp)
}
summary(get(nls[1]))