-1

我正在尝试创建一堆数据框,并在循环中修改这些数据框中的变量。下面的代码几乎可以工作,除了它创建了一大堆形式的对象df_1$x_csdf_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())]

谢谢!

4

3 回答 3

1

以下是如何翻译您的代码以使用 alist来执行此操作,而不是全局环境中的名称:

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  
于 2013-04-27T23:25:00.230 回答
-1

非常感谢 R-Help 列表中的 Blaser Nello 解决了这个问题。我认为最好分享答案。

这里有两种可能的方法:

这会稍微简化你的代码。但是它将 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())]
于 2013-04-26T13:18:32.540 回答
-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]))
于 2013-04-27T23:11:12.593 回答