我有1900份文件。我把它们导入了R环境。
temp<-list.files(pattern="foodconsumption")每个文件中有300列。
我只想从第25栏获取数据,并将它们从一端重新绑定到另一端。
我知道lapply,但我不知道如何编写函数只提取列25(名为V25)
我在网上看了一些教程,它使用功能(elt)。
lapply(temp, function(elt), elt[,25])但是我得到了一个错误:[.default中的错误(elt,25):不正确的维数
有什么更简单的方法吗?
谢谢!
发布于 2018-05-24 03:08:05
您可能已经知道这一点(在这种情况下,我很抱歉),但是函数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
})请注意,这隐含地假定所有丢失的数据都在末尾,和/或每个文件中的数据顺序是无关的。如果不是这样的话,在这里创建一个矩阵时要非常小心--最好将数据作为一个列表来处理。
发布于 2018-05-24 04:41:29
library(tidyverse)
list.files(pattern = ".csv") %>%
map_dfc( ~read_csv(.x) %>% # map_dfc: column combined to dataframe
select(2) # choose columns
)https://stackoverflow.com/questions/50500244
复制相似问题