从许多变量中提取列以在R中构建新变量

时间:2012-09-17 02:12:11

标签: r

我将一堆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'

而收到错误

2 个答案:

答案 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])

}