【问题标题】:Creating new variables for multiple data frames in a for loop在 for 循环中为多个数据框创建新变量
【发布时间】:2020-05-10 16:14:02
【问题描述】:

我有 8 个数据框,我想为每个数据框创建一个变量。我使用了一个 for 循环,我使用的代码如下所示:

year <- 2001
dflist <- list(bhps01, bhps02, bhps03, bhps04, bhps05, bhps06, bhps07, bhps08)

for (df in dflist){
df[["year"]] <- as.character(year)
assign()
year <- year + 1
}

bhps01,...,bhps08 是数据框对象,year 是字符变量。 bhps01 是 2001 年的数据框, bhps02 是 2002 年的数据框,依此类推。

每个数据对应一个年份,所以 bhps01 对应 2001 年,bhps 对应 2002 年,以此类推。所以,我想为这些数据中的每一个创建一个年份变量。因此,对于 bhps01 数据,年份变量将为“2001”,对于 bhps02 数据为“2002”,依此类推。

代码运行良好,但除了局部变量 df 之外,它没有为任何一个数据帧创建变量 year。

有人可以解释上面代码中的错误吗?或者有没有做同样事情的替代方法?

【问题讨论】:

    标签: r dataframe for-loop


    【解决方案1】:

    for 循环中的语法错误。我不完全确定你想要完成什么,但让我们试试这个

    year = 2001 
    
    A = data.frame(a = c(1, 1), b = c(2, 2))
    B = data.frame(a = c(1, 1), b = c(2, 2))
    L = list(A, B)
    
    for (i in seq_along(L)) {
      L[[i]][, dim(L[[i]])[2] + 1] = as.character(rep(year,dim(L[[i]])[1]))  
      year = year + 1
    }
    

    有输出

    > L
    [[1]]
      a b   V3
    1 1 2 2001
    2 1 2 2001
    
    [[2]]
      a b   V3
    1 1 2 2002
    2 1 2 2002
    

    这就是你想要的输出,对吗?

    为了将列名更改为“年份”,您可以这样做

    L = lapply(L, function(x) {colnames(x)[3] = "year"; x})
    

    【讨论】:

    • 我已经使用以下代码进行了尝试:year = 2001 L &lt;- list(bhps01, bhps02) for (i in seq_along(L)) { L[[i]][, dim(L[[i]])[1] + 1] = as.character(rep(year,dim(L[[i]])[1])) year = year + 1 },但它给了我以下错误消息:[&lt;-.data.frame(*tmp*, , dim(L[[i]])[ 1] + 1, value = c("2001", : 新列会在现有列之后留下孔
    • 我有 8 个数据帧,即 bhps01、bhps02、bhps03、bhps04、bhps05、bhps06、bhps07 和 bhps08。每个数据对应一年,所以 bhps01 对应 2001,bhps 对应 2002,依此类推。所以,我想为这些数据中的每一个创建一个年份变量。因此,对于 bhps01 数据,年份变量将为“2001”,对于 bhps02 数据为“2002”,依此类推。我希望现在清楚了吗?
    • 对不起,有一个错字!试试这个year = 2001 L &lt;- list(bhps01, bhps02) for (i in seq_along(L)) { L[[i]][, dim(L[[i]])[2] + 1] = as.character(rep(year,dim(L[[i]])[1])) year = year + 1 }
    • 您好这次代码运行了,但是仍然没有为任何一个数据框创建变量“year”?
    • 不,变量可能是V3。不过,您可以使用命令L = lapply(L, function(x) {colnames(x)[3] = "year"; x}) 重命名它。现在可以用了吗?
    【解决方案2】:

    您从列表中获取数据帧的副本,并将变量“year”添加到其中,但随后不要将其分配到任何地方,这就是它被丢弃的原因(即不存储在变量中)。这是一个修复:

    year <- 2001
    dflist <- list(bhps01, bhps02, bhps03, bhps04, bhps05, bhps06, bhps07, bhps08)
    
    counter <- 0
    for (df in dflist){
      counter <- counter + 1
      df[["year"]] <- as.character(year)
      dflist[[counter]] <- df
      year <- year + 1
    }
    

    如果您想要编辑原始数据框,您可以将结果分配回而不是列表中。这有点间接路线,请注意创建带有名称的 dflist 的变化。我们创建 df,然后将其分配给原始名称。例如:

    year <- 2001
    dflist <- list(bhps01 = bhps01, bhps02 = bhps02, bhps03 = bhps03, bhps04 = bhps04, bhps05 = bhps05, bhps06 = bhps06, bhps07 = bhps07, bhps08 = bhps08)
    
    counter <- 0
    for (df in dflist){
      counter <- counter + 1
      df[["year"]] <- as.character(year)
      dflist[[counter]] <- df
      assign(names(dflist)[counter], df)
      year <- year + 1
    }
    

    【讨论】:

    • 我试过这段代码。代码运行良好,但变量 year 没有在这些数据帧中创建。
    • 这是因为当您使用 bhps01、02 等创建数据框时,更改现在位于您创建的列表 (dflist) 中。如果您想让每个单独的数据框都有 year 变量,您可以将它们分配回去。循环结束后: bhps01
    • 如何自动化 bhps01
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2022-01-26
    相关资源
    最近更新 更多