代码之家  ›  专栏  ›  技术社区  ›  user6883405

根据r中的列表名称重命名数据帧的列

  •  2
  • user6883405  · 技术社区  · 7 年前

    我在一个列表对象中保存了多个数据帧。它们共享相同的两个列名。我想将第二列重命名为数据帧的名称。

    示例数据:

    df1 <- data.frame(A = 1:10, B= 11:20)
    df2 <- data.frame(A = 21:30, B = 31:40) 
    df3 <- data.frame(A = 31:40, B= 41:50)
    df4 <- data.frame(A = 51:80, B = 61:70) 
    
    listDF <- list(df1, df2,df3, df4)
    

    我正在尝试使用laply重命名第二列以匹配数据帧的名称。

    # trying to rename second column after the element of the list they're located in
    listDF_2 <- lapply(names(listDF), function(x) setNames(listDF[[x]], x) )
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   see-king_of_knowledge    7 年前

    要跟踪姓名,可以使用:

    listDF <- list(df1 = df1, df2 = df2, df3  = df3, df4 = df4)
    

    然后可以使用for循环:

    for (i in names(listDF)){
      colnames(listDF[[i]]) <- c("A", i)
    }
    

    或者如果您需要使用lapply,您可以使用它:

    newDF <- lapply(names(listDF), function(x){
      colnames(listDF[[x]]) <- c("A", x)
      listDF[[x]]
    })
    names(newDF) <- names(listDF) 
    
        2
  •  3
  •   MKR    7 年前

    你可能喜欢用 dplyr::bind_rows 在这种情况下。它简化了将data.frames的名称用作组合数据帧中的新列。

    # Create list as.
    listDF <- list(df1 = df1, df2 = df2,df3 = df3, df4 = df4)
    
    library(dplyr)
    
    # Now combine all data frames. The name of data frame will be in 'DF_Name' column
    bind_rows(listDF, .id = "DF_Name")
    
    #    DF_Name  A  B
    # 1      df1  1 11
    # 2      df1  2 12
    # 3      df1  3 13
    # 4      df1  4 14
    # 5      df1  5 15
    # 6      df1  6 16
    # 7      df1  7 17
    # 8      df1  8 18
    # 9      df1  9 19
    # 10     df1 10 20
    # 11     df2 21 31
    # 12     df2 22 32
    # 13     df2 23 33
    #.................
    #.................
    # 58     df4 78 68
    # 59     df4 79 69
    # 60     df4 80 70
    

    注: 作为 @Moody_Mudskippe 已经指出一个人可以简单地使用

    listDF <- lst(df1, df2, df3, df4)
    

    然后使用 dpylr::绑定\u行 .