【问题标题】:Paste element name onto columns in each list element将元素名称粘贴到每个列表元素的列上
【发布时间】:2019-04-25 10:16:51
【问题描述】:

我有一个数据框列表。每个列表元素都有一个唯一的名称,但列名在所有数据框中都是相同的。

我想paste将每个数据框的名称添加到列中,这样当我将cbind它们组合成一个单独的大数据框时我可以区分它们。

示例数据;

LIST <- list(df1 = data.frame("ColA" = c(1:5), "ColB" = c(10:14)), 
             df2 = data.frame("ColA" = c(21:25), "ColB" = c(30:34)))

str(LIST)

List of 2
 $ df1:'data.frame':    5 obs. of  2 variables:
  ..$ ColA: int [1:5] 1 2 3 4 5
  ..$ ColB: int [1:5] 10 11 12 13 14
 $ df2:'data.frame':    5 obs. of  2 variables:
  ..$ ColA: int [1:5] 21 22 23 24 25
  ..$ ColB: int [1:5] 30 31 32 33 34

期望的输出;

List of 2
     $ df1:'data.frame':    5 obs. of  2 variables:
      ..$ df1.ColA: int [1:5] 1 2 3 4 5
      ..$ df1.ColB: int [1:5] 10 11 12 13 14
     $ df2:'data.frame':    5 obs. of  2 variables:
      ..$ df2.ColA: int [1:5] 21 22 23 24 25
      ..$ df2.ColB: int [1:5] 30 31 32 33 34

【问题讨论】:

    标签: r list dataframe paste


    【解决方案1】:

    既然你稍后提到你想使用cbind,你可以马上使用as.data.frame

    as.data.frame(LIST)
    #  df1.ColA df1.ColB df2.ColA df2.ColB
    #1        1       10       21       30
    #2        2       11       22       31
    #3        3       12       23       32
    #4        4       13       24       33
    #5        5       14       25       34
    

    感谢@RonakShah,您可以使用以下几行来获取列表以备不时之需

    df1 <- as.data.frame(LIST)
    split.default(df1, sub("\\..*", "", names(df1)))
    

    【讨论】:

    • 完美!我不知道 as.data.frame 的行为。比我尝试的要简单得多!
    【解决方案2】:

    您可以在 lapply 中使用全局分配 &lt;&lt;- 执行此操作。

    lapply(seq_along(LIST), function(x) 
      names(LIST[[x]]) <<- paste0(names(LIST)[x], ".", names(LIST[[x]])))
    

    或使用Map 作为@Sotos 建议

    LIST <- Map(function(x, y) {names(x) <- paste0(y, '.', names(x)); x}, LIST, names(LIST))
    

    产量

    str(LIST)
    # List of 2
    # $ df1:'data.frame':   5 obs. of  2 variables:
    #   ..$ df1.ColA: int [1:5] 1 2 3 4 5
    # ..$ df1.ColB: int [1:5] 10 11 12 13 14
    # $ df2:'data.frame':   5 obs. of  2 variables:
    #   ..$ df2.ColA: int [1:5] 21 22 23 24 25
    # ..$ df2.ColB: int [1:5] 30 31 32 33 34
    

    【讨论】:

    • 另一个(更易读的 IMO)变体是 Map(function(x, y) {names(x) &lt;- paste0(y, '.', names(x)); x}, LIST, names(LIST))
    • @Sotos Nice,所以我们可以在没有 &lt;&lt;- 的情况下做到这一点,包括在答案中。
    【解决方案3】:

    您好,您可以使用map2 来执行此操作:

    library(tidyverse)
    map2(mylist, names(mylist), ~rename_all(.x, function(z) paste(.y, z, sep = ".")))
    

    编辑: 或者按照评论中的建议使用imap

    imap(mylist, ~rename_all(.x, function(z) paste(.y, z, sep = ".")))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-18
      • 2020-02-13
      • 2020-01-09
      • 2021-10-17
      • 2014-04-09
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多