首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提取数据帧R列表中列的内容

提取数据帧R列表中列的内容
EN

Stack Overflow用户
提问于 2018-05-24 02:56:29
回答 2查看 3K关注 0票数 1

我有1900份文件。我把它们导入了R环境。

代码语言:javascript
复制
temp<-list.files(pattern="foodconsumption")

每个文件中有300列。

我只想从第25栏获取数据,并将它们从一端重新绑定到另一端。

我知道lapply,但我不知道如何编写函数只提取列25(名为V25)

我在网上看了一些教程,它使用功能(elt)。

代码语言:javascript
复制
lapply(temp, function(elt), elt[,25])

但是我得到了一个错误:[.default中的错误(elt,25):不正确的维数

有什么更简单的方法吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-24 03:08:05

您可能已经知道这一点(在这种情况下,我很抱歉),但是函数list.files正是这样做的--它的输出是满足模式标准的所有文件的向量。它实际上并不导入文件。我会按以下方式安排你的程序。

请注意,我假设您正在处理.csv文件。对于任何文本文件,都应该进行适当的修改。如果是.xlsx文件,则需要额外的包。如果它们是.Rdata文件,则需要进行其他修改。

代码语言:javascript
复制
files <- list.files(pattern = "foodconsumption")
result <- sapply(files, function(file) {
   # read in file
   temp <- read.csv(file) # adjustments may be needed for headers, etc.

   # return column 25
   temp[,25]
})

假设每个文件都有相同的行数,则该文件的输出是一个矩阵,其中25列和行等于文件中的行。为了执行与rbind相当的操作,我们只需使用转置:

代码语言:javascript
复制
t(result)

如果行数不同,则输出为列表,转置将无法工作。在这种情况下,您需要填写缺少的值:

代码语言:javascript
复制
max_length <- max(sapply(result, length))
result_mat <- sapply(result, function(x) {
  if (length(result) < max_length) c(result, rep(NA, max_length - length(result)))
  else result
})

请注意,这隐含地假定所有丢失的数据都在末尾,和/或每个文件中的数据顺序是无关的。如果不是这样的话,在这里创建一个矩阵时要非常小心--最好将数据作为一个列表来处理。

票数 3
EN

Stack Overflow用户

发布于 2018-05-24 04:41:29

代码语言:javascript
复制
library(tidyverse)
list.files(pattern = ".csv") %>% 
    map_dfc( ~read_csv(.x) %>%  # map_dfc: column combined to dataframe 
              select(2) # choose columns
           )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50500244

复制
相关文章

相似问题

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