首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在数据列表中有条件地修改

在数据列表中有条件地修改
EN

Stack Overflow用户
提问于 2017-04-11 01:32:42
回答 2查看 69关注 0票数 0

我一直在使用包含大量数据的WHO包。get_data函数允许将多个表拉进data.frames列表(使用lapply),这是一件好事。

代码语言:javascript
运行
复制
### 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,可能使用来自dplyrbind_rows函数。一个问题是,每个data.frames都以不同的顺序附带了名为'value'的响应变量(因此不可能在列表中的每个数据帧中子集相同数量的列)。类似的问题出现在列的类中,例如'year'。基本上,每次修改都需要有条件地按名称查找特定列并分配新值。

我的解决方案是使用for循环,但我认为必须有一种使用lapply类型函数的更简洁的方法。这是为了改变名字和年份类。

代码语言:javascript
运行
复制
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)

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-11 01:58:48

您可以在mutate_at调用中使用lapply将“年份”和“值”列的类更改为数字。由于列表中的data.frames有不同的列数,所以我建议使用full_join使用Reduce

代码语言:javascript
运行
复制
library(dplyr)
SECON <-lapply(SECON, function(df) mutate_at(df, .cols = c("year","value"), as.numeric))
output <- Reduce(full_join, SECON)

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

票数 1
EN

Stack Overflow用户

发布于 2017-04-11 01:56:33

您可以嵌套几个函数,如:

代码语言:javascript
运行
复制
f.bind <- function(x){

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

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

内部函数只是包装一个小的dplyr选择函数,外部函数应用内部和绑定所有的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43335341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档