在循环中更改多个数据框

3
例如,我有这三个数据集(在我的情况下,它们还有更多的变量):
data_frame1 <- data.frame(a=c(1,5,3,3,2), b=c(3,6,1,5,5), c=c(4,4,1,9,2))
data_frame2 <- data.frame(a=c(6,0,9,1,2), b=c(2,7,2,2,1), c=c(8,4,1,9,2))
data_frame2 <- data.frame(a=c(0,0,1,5,1), b=c(4,1,9,2,3), c=c(2,9,7,1,1))

在每个数据框上,我想添加一个由该数据框上现有变量转换而来的变量。我希望通过循环来实现这一点。例如:

datasets <- c("data_frame1","data_frame2","data_frame3")
vars <- c("a","b","c")
for (i in datasets){
    for (j in vars){
        # here I need a code that create a new variable with transformed values
        # I thought this would work, but it didn't...
        get(i)$new_var <- log(get(i)[,j])
    }
}

你对此有一些有效的建议吗?

此外,如果可以通过字符字符串为新列指定名称(在这种情况下为new_var),那对我来说就太好了,这样我就可以创建另一个嵌套在另外两个循环中的for循环来创建新变量。

希望我没有在解释我的问题时太过纠结。

提前感谢。


谢谢。你能解释一下另一种方法吗? - this.is.not.a.nick
我已经阅读了你删除的评论。你说有一种更简单的方法来做这件事。 - this.is.not.a.nick
不,一些列的日志记录,其他列的转换... - this.is.not.a.nick
2个回答

7
您可以将数据框放在一个列表中,然后使用lapply逐个处理它们。因此,在这种情况下无需使用循环。
例如,您可以这样做:
data_frame1 <- data.frame(a=c(1,5,3,3,2), b=c(3,6,1,5,5), c=c(4,4,1,9,2))
data_frame2 <- data.frame(a=c(6,0,9,1,2), b=c(2,7,2,2,1), c=c(8,4,1,9,2))
data_frame3 <- data.frame(a=c(0,0,1,5,1), b=c(4,1,9,2,3), c=c(2,9,7,1,1))

ll <- list(data_frame1,data_frame2,data_frame3)
lapply(ll,function(df){
  df$log_a <- log(df$a)          ## new column with the log a
  df$tans_col <- df$a+df$b+df$c  ## new column with sums of some columns or any other           
                                 ##   transformation
  ###  .....
  df

})

数据框 dataframe1 变成:

[[1]]
  a b c     log_a tans_col
1 1 3 4 0.0000000        8
2 5 6 4 1.6094379       15
3 3 1 1 1.0986123        5
4 3 5 9 1.0986123       17
5 2 5 2 0.6931472        9

@agstudy 我在我的数据上尝试了你的解决方案。我注意到它并没有真正地写入新变量。在你的例子中,log_a和tans_col并没有被插入到数据框中。我肯定是错过了什么... - this.is.not.a.nick
1
在这种情况下,我使用 $ 将创建新变量 @this.is.not.a.nick.. df$log_a 将创建名称为 log_a 的变量...您已经尝试过您的数据了吗? - agstudy
@agstudy 是的,但是如果我按照你的例子输入 ll[[1]]$log_a,R 将返回 NULL - this.is.not.a.nick
@this.is.not.a.nick 这是正常的,R会在ll的副本中进行转换,因此您需要执行类似于ll <- lapply(ll,function(df)...的操作来更改列表的值。 - agstudy
正如我所想,我的问题很愚蠢。:) 非常感谢 @agstudy - this.is.not.a.nick

0

我有同样的需求,也想在我的实际数据框列表中更改列。

我发现了一个很棒的方法这里(问题中的purrr::map2方法适用于具有不同列的数据框),然后执行以下操作:

list2env(list_of_dataframes ,.GlobalEnv)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接