【问题标题】:Convert LIst To Dataframe Using For Loop And Saving Under Different Names In R使用 For 循环将 LIst 转换为数据框并在 R 中以不同的名称保存
【发布时间】:2020-06-12 00:00:41
【问题描述】:

我正在尝试将包含 52 个组件的列表转换为每个组件的数据框。 不使用 for 循环会看起来像这样,很乏味:

df1 = as.data.frame(list[1])
df2 = as.data.frame(list[2])
df3 = as.data.frame(list[3])
.
.
.
df50 = as.data.frame(list[50])

如何使用 for 循环实现这一点?我的尝试:

for (i in seq_along(list)) {
  noquote(paste0("df", i)) = as.data.frame(list[i]) 
}

Error: target of assignment expands to non-language objec

我想我必须邀请assign

【问题讨论】:

  • 使用assign 而不是noquoteassign(paste0("df", i), value = list[[i]]) 话虽如此,不推荐。您可以将 data.frames 保存在单个 list 中,而不是全局环境中的 50 个对象
  • 如果您将它们列在一个列表中,您的生活会轻松很多。你可以用df <- lapply(list, as.data.frame)把它们做成data.frames,然后用df[[1]]df[[2]]等提取。
  • 最好保存在命名列表中:dfs <- setNames(lapply(mylist, as.data.frame), paste0("df", seq_along(mylist))) 提取为dfs$df1dfs$df2

标签: r for-loop assign


【解决方案1】:

如果您在list 中有数据框列表,您可以命名它们,然后使用list2env 将它们作为环境中的单独数据框。

names(list) <- paste0('df', seq_along(list))
list2env(list, .GlobalEnv)

使用可重现的示例,

temp <- list(mtcars, mtcars)
names(temp) <- paste0('df', seq_along(temp))
list2env(temp, .GlobalEnv)


head(df1)
#                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

head(df2)
#                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

但是,请注意

  • list 是 R 中的一个内部函数,因此最好将变量命名为其他名称。
  • 正如@MrFlick 建议的那样,尝试将数据保存在列表中,因为列表更易于管理,而不是在全局环境中创建大量对象。

【讨论】:

    【解决方案2】:

    我们可以在 OP 的函数中使用 assign 而不是 noquote

    for (i in seq_along(list)) {
        assign(paste0("df", i), value = list[[i]]) 
        }
    

    【讨论】:

      猜你喜欢
      • 2021-04-16
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多