我将一堆CSV文件加载到R中。我对如何从加载的数据中提取第二列并创建新变量有疑问。我想我想知道R中是否有任何函数可以“将'提取行'添加到这个新变量中。我当前的代码只保留最后一个变量的第二列。很抱歉要问这些基本操作。
以下是我的R代码:
filenames=dir() #Scan file names
for (i in filenames){
adt = substr(x = i, start = 1, stop = nchar(i)-4)
name=paste("data_", adt, sep="")
tmp <- read.csv(i, header=TRUE, sep=",")
assign(name, tmp, pos=.GlobalEnv) #save all the imported CSV content
FB_d <- data.frame(cbind(tmp[,2])) # I would like add the second column to a new variable, and I failed here...
}
感谢您的任何建议。
我尝试了FB_d <- cbind(FB_d,tmp2[,1])
,但由于找到'FB_d'
答案 0 :(得分:2)
我会选择更像这样的东西:
write.csv(mtcars[1:5,],file = "~/Desktop/folder/file1.csv")
write.csv(mtcars[6:10,],file = "~/Desktop/folder/file2.csv")
setwd("~/Desktop/folder")
f <- list.files("~/Desktop/folder")
dat <- lapply(f,read.csv)
names(dat) <- paste0("data_",substr(f,1,nchar(f)-4))
do.call(cbind,lapply(dat,'[[',2))
即。尽可能使用矢量化和列表结构。此外,我(暂时)会从你的词汇中消除assign
。它是特定情况下非常具体用途的高级功能,不应用于“普通”用途。
我还应该添加一个警告,cbind
大量(大)列会很快变得非常缓慢,该问题的解决方案是首先初始化数据结构(预分配)然后分配到它。
答案 1 :(得分:0)
我喜欢使用此方法加载csv,如果不是特别有效:
fileList = list.files(path='path/to/files', pattern='xxxx.csv')
FB_d <- vector()
dat<-lapply(fileList,read.csv,header=T,sep = "\t") #and then
for(i in 1:length(dat)) {
#do stuff here
data_from_csv <- as.data.frame(dat[i])
##EDIT--adding to vector for each loop
FB_d <- append(FB_d, data_from_csv[,2])
}