我有1900个文件。 我将它们导入R环境。
temp<-list.files(pattern="foodconsumption")
在每个文件中有300列。
我只想从第25列获取数据,并将它们从一端到另一端重新绑定。
我知道lapply,但我不知道怎么写函数只提取column.25(名为V25)
我在线观看了一些教程,它使用了fucntion(elt)。
lapply(temp, function(elt), elt[,25])
但是我收到了这个错误:[.default
(elt ,, 25)错误:维数不正确
有什么更容易的方法吗?
谢谢!
答案 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
)