【问题标题】:returning from list to data.frame after lapplylapply 后从列表返回到 data.frame
【发布时间】:2016-06-24 20:20:03
【问题描述】:

我有一个关于 lapply 的非常简单的问题。我正在从 STATA 过渡到 R,我认为有一些非常基本的概念我没有得到关于在 R 中循环的知识。但是我整个下午都在阅读它并且无法找到一种合理的方法来做这个非常简单的事情.

我有三个数据框 df1、df2 和 df3,它们都具有相同的列名、相同的顺序等。

我想一次性重命名它们的列。

我将数据框放在一个列表中:

dflist <- list(df1, df2, df3)

我想要的新名称:

varlist <- c("newname1", "newname2", "newname3")

编写一个函数,将名称替换为 varlist 中的名称,并将其应用于数据帧

ChangeNames <- function(x) {
  names(x) <- varlist 
  return(x)
}

dflist <- lapply(dflist, ChangeNames)

因此,据我了解,R 更改了我放入列表中的数据帧副本的名称,但没有更改原始数据帧本身。我希望重命名数据框本身,而不是列表的元素(被困在列表中)。

现在我可以走了

df1 <- as.data.frame(dflist[1])
df2 <- as.data.frame(dflist[2])
df2 <- as.data.frame(dflist[3])

但这似乎很奇怪。你需要一个循环来取回循环的元素吗?

基本上:一旦您将一些数据框放入一个列表并通过 lapply 在它们上运行您的函数,您如何将它们从列表中移出,而不是从第一个开始?

【问题讨论】:

  • 我认为更多的 R 方法是使用 bigdf &lt;- dplyr::bind_rows(dflist, .id = "dfid") 之类的东西将 3 个数据帧绑定在一起,然后在需要时将其子集在 dfid 列中。
  • 如果 data.frames 具有相似的结构,最好将它们保存在一个列表中并从那里使用它们。请特别参阅this post,gregor 关于为什么这是一项好技术的回答。
  • 感谢 Imo 引导我回答 gregor 的这个答案。很有帮助。

标签: r lapply


【解决方案1】:

如果您只想更改名称,这在 R 中并不难。请记住,赋值运算符 &lt;- 可以按顺序应用。因此:

names(df1) <- names(df2) <- names(df3) <- c("newname1", "newname2", "newname3")

【讨论】:

    【解决方案2】:

    我不确定我的理解是否正确,您要重命名数据框的列还是包含数据框的列表组件?

    如果是第一个,请先搜索再提问,问题已经问过here

    因此,如果列表中有更多数据框,您可以轻松地执行以下操作:

    # Creating some sample data first
    > dflist <- list(df1 = data.frame(a = 1:3, b = 2:4, c = 3:5),
    + df2 = data.frame(a = 4:6, b = 5:7, c = 6:8),
    + df3 = data.frame(a = 7:9, b = 8:10, c = 9:11))
    
    # See how it looks like
    > dflist
        $df1
      a b c
    1 1 2 3
    2 2 3 4
    3 3 4 5
    
    $df2
      a b c
    1 4 5 6
    2 5 6 7
    3 6 7 8
    
    $df3
      a  b  c
    1 7  8  9
    2 8  9 10
    3 9 10 11
    
    # And do the trick
    > dflist <- lapply(dflist, setNames, nm = c("newname1", "newname2", "newname3"))
    
    # See how it looks now
    > dflist
    
    $df1
      newname1 newname2 newname3
    1        1        2        3
    2        2        3        4
    3        3        4        5
    
    $df2
      newname1 newname2 newname3
    1        4        5        6
    2        5        6        7
    3        6        7        8
    
    $df3
      newname1 newname2 newname3
    1        7        8        9
    2        8        9       10
    3        9       10       11
    

    因此,列表中每个数据框的名称从abc 更改为newname1newname2newname3

    如果是第二个,你可以这样做:

    > names(dflist) <- c("newname1", "newname2", "newname3")
    

    【讨论】:

    • 嗨。我的问题与其说是重命名,不如说是在运行带有 lapply 的函数后有效地将数据帧从列表中取出。我刚刚包括了重命名的东西,因为这是我目前正在使用的特定示例,我知道您应该提出非常详细的问题。也许更好的说法是:
    • - 从 N 个(可能很大)具有相似结构的数据帧开始 - 将它们放在一个列表中,使用 lapply 对所有这些数据帧执行操作(重命名、清理、重新编码等) - 然后我想要返回将它们作为data.frames,以便我可以单独/异构地对它们进行分析。我如何将列表中已清理的元素从列表中取出并作为常规 data.frames 返回(就像一开始一样) Imo 指导我的 gregor 帖子建议我不应该担心它并将所有内容保留在列出整个时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多