我一直在使用包含大量数据的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,可能使用来自dplyr的bind_rows函数。一个问题是,每个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)
}发布于 2017-04-11 01:58:48
您可以在mutate_at调用中使用lapply将“年份”和“值”列的类更改为数字。由于列表中的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对应于所有列表元素中的行总数。
发布于 2017-04-11 01:56:33
您可以嵌套几个函数,如:
f.bind <- function(x){
f.get <- function(x){
x %>%
dplyr::select(region, year, value)
}
x = lapply(c, f.get)
do.call(rbind,(x))
}内部函数只是包装一个小的dplyr选择函数,外部函数应用内部和绑定所有的结果。
https://stackoverflow.com/questions/43335341
复制相似问题