我一直在使用包含大量数据的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)
}
答案 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函数,而外部函数正在应用内部函数并绑定所有结果。