有条件地修改数据帧列表

时间:2017-04-11 01:32:42

标签: r optimization subset lapply

我一直在使用包含大量数据的WHO包。一个好处是get_data函数允许将几个表拉入data.frames列表(使用lapply

### Socio-Economic indicators

    # health expenditure, GDP per capita, Literacy Rate, 
      Fertility Rate, Pop under 1 USD, Population,

socio_econ <- c("WHS7_143", "WHS9_93", "WHS9_85", "WHS9_95", 'WHS9_90', 'WHS9_86')

SECON <- lapply(socio_econ, function(t) get_data(t))

最终目标是绑定data.frames,可能使用bind_rows中的dplyr函数。一个问题是每个data.frames都以不同的顺序带有名为'value'的响应变量(因此,不可能在列表中的每个数据帧中对相同数量的列进行子集化)。列的类也会出现类似的问题,例如'year'。基本上,每个修改都需要通过名称有条件地查找特定列并分配新值。

我的解决方案是使用for循环,但我认为必须使用lapply类型函数更清洁。这是改变名字和年级的。

for (i in 1:length(socio_econ)){

  names(SECON[[i]])[which(names(SECON[[i]])=='value')] <- socio_econ[i]
  SECON[[i]]$year <- as.character(SECON[[i]]$year)

}

2 个答案:

答案 0 :(得分:1)

您可以在mutate_at来电中使用lapply来更改&#34;年&#34;的等级。和&#34;价值&#34; colums to numeric。由于列表中的data.frames列数不同,我建议full_join使用Reduce

library(dplyr)
SECON <-lapply(SECON, function(df) mutate_at(df, .cols = c("year","value"), as.numeric))
output <- Reduce(full_join, SECON)

这给了我一个尺寸为14169x8的输出对象。 14169对应于所有列表元素中的总行数。

答案 1 :(得分:0)

你可以嵌套一些函数,如:

f.bind <- function(x){

  f.get <- function(x){
      x %>% 
          dplyr::select(region, year, value)
  } 

  x = lapply(c, f.get)
  do.call(rbind,(x))
}

内部函数只是包装一个小的dplyr select函数,而外部函数正在应用内部函数并绑定所有结果。

相关问题