使用变量在for循环中创建数据框和命名列

时间:2013-04-23 17:46:02

标签: r for-loop dataframe assign

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

谢谢!

3 个答案:

答案 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]))