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

时间:2018-05-24 02:56:30

标签: r lapply

我有1900个文件。 我将它们导入R环境。

temp<-list.files(pattern="foodconsumption")

在每个文件中有300列。

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

我知道lapply,但我不知道怎么写函数只提取column.25(名为V25)

我在线观看了一些教程,它使用了fucntion(elt)。

lapply(temp, function(elt), elt[,25])

但是我收到了这个错误:[.default(elt ,, 25)错误:维数不正确

有什么更容易的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

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的等效,我们只需要转置:

t(result)

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

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
})

请注意,这隐含地假设所有丢失的数据都在最后,和/或每个文件中的数据顺序无关紧要。如果情况并非如此,请在此处创建矩阵时要非常小心 - 将数据作为列表使用可能会更好。

答案 1 :(得分:1)

library(tidyverse)
list.files(pattern = ".csv") %>% 
    map_dfc( ~read_csv(.x) %>%  # map_dfc: column combined to dataframe 
              select(2) # choose columns
           )