【问题标题】:Renaming entries of a list within a list, by using a vector containing the column names通过使用包含列名的向量重命名列表中的列表条目
【发布时间】:2021-03-14 07:50:57
【问题描述】:

我的数据如下:

DT1 <- structure(list(Province = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3), Year = c(2000, 
2000, 2000, 2001, 2001, 2001, 2002, 2002, 2002, 2000, 2000, 2000, 
2001, 2001, 2001, 2002, 2002, 2002, 2000, 2000, 2000, 2001, 2001, 
2001, 2002, 2002, 2002), Municipality = c("Something", "Anything", 
"Nothing", "Something", "Anything", "Nothing", "Something", "Anything", 
"Nothing", "Something", "Anything", "Nothing", "Something", "Anything", 
"Nothing", "Something", "Anything", "Nothing", "Something", "Anything", 
"Nothing", "Something", "Anything", "Nothing", "Something", "Anything", 
"Nothing"), Values = c(0.59, 0.58, 0.66, 0.53, 0.94, 0.2, 0.86, 
0.85, 0.99, 0.59, 0.58, 0.66, 0.53, 0.94, 0.2, 0.86, 0.85, 0.99, 
0.59, 0.58, 0.66, 0.53, 0.94, 0.2, 0.86, 0.85, 0.99)), row.names = c(NA, 
-27L), class = c("tbl_df", "tbl", "data.frame"))
DT1_list <- DT1%>%
  group_split(Province, Year)

我想重命名所有列,使用如下向量:

colnames <- c("newname1","newname2","newname3","newname4")

for (i in DT1_list) {
    names(DT1_list)[[i]] <- colnames
    }

问题是names(DT1_list)[[i]] 没有给出列名而是NULL

这样做的正确方法是什么?

编辑:

我注意到我的问题并不能很好地代表我的实际问题(我很抱歉,我没有预见到这个问题)。我的实际问题是我想重命名 4 列中的 3 列:

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

如果我使用提供的答案,第四列将变为NA。有没有办法让其他列保持原样?

【问题讨论】:

    标签: r list syntax columnname


    【解决方案1】:

    你可以使用purrr:map:

    library(purrr)                                                                                                                                                              0.59, 0.58, 0.66, 0.53, 0.94, 0.2, 0.86, 0.85, 0.99)), row.names = c(NA, 
                                                                                                                                                                                                                                       -27L), class = c("tbl_df", "tbl", "data.frame"))
    DT1_list <- DT1%>%
      group_split(Province, Year)
    
    library(purrr)                                                                                                                                                              0.59, 0.58, 0.66, 0.53, 0.94, 0.2, 0.86, 0.85, 0.99)), row.names = c(NA, 
                                                                                                                                                                                                                                       -27L), class = c("tbl_df", "tbl", "data.frame"))
    DT1_list <- DT1%>%
      group_split(Province, Year)
    
    DT1_list %>% map(~{colnames <- colnames(.x)
                       #You could also use str_replace
                       #colnames <- stringr::str_replace(colnames,"Values","NewValues")
                       colnames[1:3] <- c("newname1","newname2","newname3")
                       colnames(.x)<- colnames
                       .x})
    
    [[1]]
    # A tibble: 3 x 4
      newname1 newname2 newname3  Values
         <dbl>    <dbl> <chr>      <dbl>
    1        1     2000 Something  0.59 
    2        1     2000 Anything   0.580
    3        1     2000 Nothing    0.66 
    
    [[2]]
    # A tibble: 3 x 4
      newname1 newname2 newname3  Values
         <dbl>    <dbl> <chr>      <dbl>
    1        1     2001 Something   0.53
    2        1     2001 Anything    0.94
    3        1     2001 Nothing     0.2 
    
    ...
    

    【讨论】:

    • 感谢您的回答。我有一个小问题。我注意到在我的实际数据中,如果我不重命名所有列,我不重命名的列的名称将变为NA。这是一个问题,因为我想按名称引用这些列。有可能阻止这种情况发生吗?比如说我只想重命名 3 列。
    • 非常感谢!我为不需要图书馆而寻求另一个答案。
    • @Tom,够公平的!
    【解决方案2】:

    你可以使用lapply/map

    lapply(DT1_list, setNames, colnames)
    
    #[[1]]
    # A tibble: 3 x 4
    #  newname1 newname2 newname3  newname4
    #     <dbl>    <dbl> <chr>        <dbl>
    #1        1     2000 Something    0.59 
    #2        1     2000 Anything     0.580
    #3        1     2000 Nothing      0.66 
    
    #[[2]]
    # A tibble: 3 x 4
    #  newname1 newname2 newname3  newname4
    #     <dbl>    <dbl> <chr>        <dbl>
    #1        1     2001 Something     0.53
    #2        1     2001 Anything      0.94
    #3        1     2001 Nothing       0.2 
    #...
    #...
    

    当您想要重命名的列少于原始数据时,请使用:

    inds <- seq_along(colnames)
    lapply(DT1_list, function(x) {names(x)[inds] <- colnames;x})
    

    或者:

    library(dplyr)
    library(purrr)
    
    map(DT1_list, ~.x %>% rename_with(~colnames, inds))
    

    【讨论】:

    • 感谢您的回答!拆分只是为了重新创建与我拥有的数据相似的数据(我没有拆分原始数据,它是拆分的)。
    • 我有一个小问题。我注意到在我的实际数据中,如果我不重命名所有列,我不重命名的列的名称将变为NA。这是一个问题,因为我想按名称引用这些列。有可能阻止这种情况发生吗?比如说我只想重命名 3 列。
    • 查看处理此类情况的更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2021-10-11
    • 2020-06-24
    • 2022-10-15
    相关资源
    最近更新 更多