【问题标题】:Renaming list items containing a dataframe, using the first entry of a column of the dataframe使用数据框列的第一个条目重命名包含数据框的列表项
【发布时间】:2021-11-01 00:44:20
【问题描述】:

我的数据如下:

dataset = list()
a <- c(1,2,3)
b <- c(1,2,3)
country <- c("A","B","C")
source_country <-  c("D","D","D")
dataset[[1]] <- data.frame(a,b,country, source_country)
a <- c(NA)
b <- c(NA)
country <- c(NA)
source_country <- c(NA)
dataset[[2]] <- data.frame(a,b,country, source_country)

我想用 source_country 从同一列表项的数据框中重命名每个列表项。我尝试了以下方法:

for (i in 1:length(dataset)) {
   if (!is.null(dataset[[i]])) {
    print ("no data") 
  } else if (nrow(dataset[[i]]) > 1) {
    names(dataset)[i] <- dataset[[i]][["source_country"]][[1]]
  }   
}

但它似乎不起作用..

期望的结果:

names(dataset)[1] <- "D"
names(dataset)[2] <- "NA"

【问题讨论】:

    标签: r list


    【解决方案1】:

    使用base R

    setNames(dataset,   unlist(sapply(dataset, subset, 
       subset = seq_along(source_country) == 1, select = source_country)))
    

    -输出

    $D
      a b country source_country
    1 1 1       A              D
    2 2 2       B              D
    3 3 3       C              D
    
    $<NA>
       a  b country source_country
    1 NA NA      NA             NA
    

    【讨论】:

      【解决方案2】:

      如果您的R 版本低于4.1.0,则将\(x) 替换为function(x)

      names(dataset) <- sapply(dataset, \(x) x$source_country[1])
      

      这将为您的第二个元素命名NA。如果你想让它成为一个字符,你可以用函数 as.character 包装。


      您的循环的问题在于您正在测试列表中的每个元素是否为空(is.null 测试元素是否为空,!is.null 将其反转)。由于列表中的每个元素都是一个数据框,因此它们都不是空的,因此您的循环永远不会进入 else if 子句。您在 if 语句中所做的唯一一件事就是打印,所以没有重命名。

      你可以这样做:

      for (i in 1:length(dataset)) {
        if (nrow(dataset[[i]]) == 0) {
          print ("no data") 
        } else if (nrow(dataset[[i]]) >= 1) {
          names(dataset)[i] <- dataset[[i]][["source_country"]][1]
        }   
      }
      

      【讨论】:

        【解决方案3】:

        purrr 选项 -

        library(purrr)
        
        set_names(dataset, map_chr(dataset, pluck, "source_country", 1))
        
        #$D
        #  a b country source_country
        #1 1 1       A              D
        #2 2 2       B              D
        #3 3 3       C              D
        
        #$<NA>
        #   a  b country source_country
        #1 NA NA      NA             NA
        

        【讨论】:

          猜你喜欢
          • 2022-09-22
          • 2021-11-15
          • 2018-01-04
          • 2016-11-02
          • 2018-03-09
          • 2017-06-24
          • 2020-09-11
          • 2015-12-29
          • 2019-10-02
          相关资源
          最近更新 更多