【问题标题】:Create new variables from a list that does not exist in current dataset in R从 R 中当前数据集中不存在的列表中创建新变量
【发布时间】:2023-03-26 21:45:01
【问题描述】:

我想从包含 11 个变量的列表中创建新变量,这些变量在当前数据集中不存在(为了让我的所有数据集都具有相同的维度并能够“绑定”它们)。

这是我尝试做的(对不起,我知道这真的效率低下,我是 R 新手 - 可能有更好的方法):

DataInd <- list()
listInd <- list("SDGFPALL","WHS4_154","WHS4_100","WHS4_106","TB_1","HIV_ARTCOVERAGE","MDG_0000000013",
                "WSH_SANITATION_BASIC","BP_04","NCD_GLUC_04","TOBACCO_0000000192","WHS6_102","HWF_0001",
                "HRH_41","MH_6","SDGIHR2018","SDGIHR")

Labels <- list("year","region","country","gho","publishstate","value","worldbankincomegroup","residenceareatype","datasource","agegroup","sex")

for (k in 1:length(listInd)){
  print(k)
  Ind_name <- listInd[k]
  df <- get_data(Ind_name)
  listvar <- list(colnames(df))
  for (m in 1:length(Labels)){
    if(!(Labels[[m]] %in% colnames(df))){
      Var <- paste0("df$",Labels[m])
      Var <- NA
    }
  }
  DataInd[[length(DataInd)+1]] <- df
}

DataAll <- do.call(rbind,DataInd)

“Var”不起作用。我还没有设法将 NA 分配给需要从列表中创建的新变量。

也许将一个空数据集与我想要的 11 个变量与每个数据集合并?这行得通吗?

非常感谢,

N.

【问题讨论】:

  • 检查rbindlist 来自data.table 及其fill 参数。

标签: r for-loop


【解决方案1】:

目前尚不清楚您从哪里获得get_data 函数,但我们假设它通过将对象的名称传递给它来为您提供数据。您可以使用以下 -

listInd <- c("SDGFPALL","WHS4_154","WHS4_100","WHS4_106","TB_1","HIV_ARTCOVERAGE",
 "MDG_0000000013", "WSH_SANITATION_BASIC","BP_04","NCD_GLUC_04", 
 "TOBACCO_0000000192","WHS6_102","HWF_0001", "HRH_41","MH_6","SDGIHR2018","SDGIHR")

Labels <- c("year","region","country","gho","publishstate","value","worldbankincomegroup",
             "residenceareatype","datasource","agegroup","sex")


output <- do.call(rbind, lapply(listInd, function(x) {
    df <- get_data(x)
    df[setdiff(Labels, colnames(df))] <- NA
    return(df)
}))

但是,正如@nicola 提到的那样,data.table 应该也可以工作

output <- data.table::rbindlist(lapply(listInd, get_data), fill = TRUE)

【讨论】:

    【解决方案2】:

    我通过这样做解决了我的问题:

    listInd <- list("SDGFPALL","WHS4_154","WHS4_100","WHS4_106","TB_1","HIV_ARTCOVERAGE","MDG_0000000013",
                    "WSH_SANITATION_BASIC","BP_04","NCD_GLUC_04","TOBACCO_0000000192","WHS6_102","HWF_0001",
                    "HWF_0006","SDGIHR2018","SDGIHR")
    
    DataInd <- list()
    for (k in 1:length(listInd)){
      print(k)
      Ind_name <- listInd[k]
      df <- get_data(Ind_name)
      DataInd[[length(DataInd)+1]] <- df
    }
    
    DataAll <- Reduce(function(x, y) merge(x, y, all=TRUE), DataInd)
    

    【讨论】:

      猜你喜欢
      • 2021-03-07
      • 1970-01-01
      • 2021-10-06
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多