【问题标题】:How can I put the names of dataframes that are stored in a list into the column names of each dataframe?如何将存储在列表中的数据框的名称放入每个数据框的列名中?
【发布时间】:2020-09-19 13:56:06
【问题描述】:

目标:为一长串数据框添加数据框名称作为某些列的前缀

问题:使用 lapply 或循环似乎 R 没有将数据帧的名称传递给方法。

数据:

A<-data.frame(column_1=c(1,2,3),column_2=c(4,5,6),column_3=c(7,8,9),column_4=c(10,11,12))
B<-data.frame(column_1=c(13,14,15),column_2=c(16,17,18),column_3=c(19,20,21),column_4=c(22,23,24))
C<-data.frame(column_1=c(25,26,27),column_2=c(28,29,30),column_3=c(31,32,33),column_4=c(34,35,36))
list_of_dataframes<-list(A,B,C)
names(list_of_dataframes)<-c("A","B","C")

这只是一个例子。实际上我的数据框列表很长。因此,像 here 那样使用“评论”手动添加名称是不方便的。

所需的解决方案:

$A
  A_column_1 A_column_2 A_column_3 column_4
1          1          4          7       10
2          2          5          8       11
3          3          6          9       12

$B
  B_column_1 B_column_2 B_column_3 column_4
1         13         16         19       22
2         14         17         20       23
3         15         18         21       24

$C
  C_column_1 C_column_2 C_column_3 column_4
1         25         28         31       34
2         26         29         32       35
3         27         30         33       36

如您所见,数据框名称位于列名中,但我想从该操作中排除的第 4 列除外。

我的尝试:

所需的解决方案实际上是由一些代码产生的:

comment(list_of_dataframes$A) <- "A"
comment(list_of_dataframes$B) <- "B"
comment(list_of_dataframes$C) <- "C"


list_of_dataframes<-lapply(list_of_dataframes,function(dataframe){

  a<-comment(dataframe)


  colnames(dataframe)[c(1,2,3)]<-paste(a, colnames(dataframe)[c(1,2,3)], sep = "_") 

  return(dataframe)


}
)

list_of_dataframes

这个解决方案的问题是我实际上有一个很长的数据框列表,而且我有很多这样的列表。所以,我需要以自动化的方式完成所有这些工作。 在上面的代码中,我使用“comment”,分别输入每个数据框的名称。我需要自动取每个数据框的名称。我该怎么做?

我尝试在这里使用 deparse(substitute(dataframe)):

list_of_dataframes<-lapply(list_of_dataframes,function(dataframe){

  a<-deparse(substitute(dataframe))


  colnames(dataframe)<-paste(a, colnames(dataframe), sep = "_") 

  return(dataframe)


}
)

但是,您可以看到数据框的名称似乎没有传递给 lapply:

$A
  X[[i]]_column_1 X[[i]]_column_2 X[[i]]_column_3 X[[i]]_column_4
1               1               4               7              10
2               2               5               8              11
3               3               6               9              12

$B
  X[[i]]_column_1 X[[i]]_column_2 X[[i]]_column_3 X[[i]]_column_4
1              13              16              19              22
2              14              17              20              23
3              15              18              21              24

$C
  X[[i]]_column_1 X[[i]]_column_2 X[[i]]_column_3 X[[i]]_column_4
1              25              28              31              34
2              26              29              32              35
3              27              30              33              36

您有什么想法可以解决这个问题吗?

【问题讨论】:

    标签: r list dataframe rename prefix


    【解决方案1】:

    在base R中,你可以这样做:

    Map(function(x, y) {names(x)[1:3] = paste(y, names(x)[1:3], sep = "_");x}, 
                       list_of_dataframes, names(list_of_dataframes))
    

    或者使用来自purrrimap

    library(dplyr)
    purrr::imap(list_of_dataframes, 
                 ~.x %>% rename_at(1:3, function(x) paste(.y, x, sep = "_")))
    
    
    #$A
    #  A_column_1 A_column_2 A_column_3 column_4
    #1          1          4          7       10
    #2          2          5          8       11
    #3          3          6          9       12
    
    #$B
    #  B_column_1 B_column_2 B_column_3 column_4
    #1         13         16         19       22
    #2         14         17         20       23
    #3         15         18         21       24
    
    #$C
    #  C_column_1 C_column_2 C_column_3 column_4
    #1         25         28         31       34
    #2         26         29         32       35
    #3         27         30         33       36
    

    【讨论】:

      【解决方案2】:

      我们也可以使用str_c

      library(dplyr)
      library(purrr)
      imap(list_of_dataframes, ~ {
                  nm1 <- .y
                  .x %>% rename_at(1:3, ~ str_c(nm1, ., sep="_"))
              })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 2021-09-14
        • 2018-01-04
        • 2019-10-31
        相关资源
        最近更新 更多