2012-09-17 50 views
0

我將一堆CSV文件加載到R.我對如何從加載的數據中提取第二列並創建一個新變量有疑問。我想我想知道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

如果你已經加載了一個csv,你可以說FB_d < - tmp [,2] – ako

+0

我想添加來自不同csvs的第二列到一個變量中。我想我很困惑如何索引它 –

回答

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。對於特定情況下的特定用途而言,它是一種高級功能,不應該普遍用於「普通」目的。

我還應該添加一個警告,說明大量(大)列的速度會非常快,解決這個問題的方法是首先初始化您的數據結構(預先分配)然後分配給它。

+0

謝謝!但對於教育方面的建議,有沒有辦法修復我的代碼? –

+0

@ tao.hong嗯,我認爲我的答案是修復代碼的方法。 ;)但是如果你堅持,以你的更新爲出發點,你可能會在'for'循環的第一次迭代中添加一個'if-then'子句,它將_creates_'FB_d',然後'cbind's給它之後。 – joran

+0

謝謝!我想我會採用你的方法 –

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

} 
+0

這並沒有解決每次通過for循環覆蓋'FB_d'的問題。 – joran

+0

@joran:有什麼建議嗎? –

+0

@joran:的確如此。我現在看到他想要做什麼;將來自所有表格列2的變量存儲在相同的變量中。 – ako

相關問題