2011-08-11 184 views
4

我有一個csv,看起來像集R中數據幀

Deamon,Host,1:2:4,aaa.03 
Pixe,Paradigm,1:3:5,11.us 

我需要閱讀到這一點進行分析,但在我的數據中的第3列由分隔的數據框:和需要讀取就像一組或列表1.e被分割:以便它返回(1,2,4)。是否有可能在R中有一個列表列。或者你認爲我可以如何最好地解決這個問題。使用gsub來完成替換字符

+1

第三列是否總是有三個以冒號分隔的數字?或者它可以有三個以上? –

+0

有時候可能有3個以上的數字 – damola

+0

請參閱我的答案,瞭解不同數量的':'。如果* nix OS在你的庫中,你也可以看看其他的預處理工具來處理它,比如'sed'或'awk'。 – Chase

回答

4

您可以使用strsplit一個字符向量分成組件的列表:

x <- c("1:2:4", "1:3:5") 
strsplit(x, split=":") 
[[1]] 
[1] "1" "2" "4" 

[[2]] 
[1] "1" "3" "5" 
1

嘗試:

R> str <- "1:2:4" 
R> str 
[1] "1:2:4" 
R> gsub(":", ",", str) 
[1] "1,2,4" 

確保列是一個字符串不是事先的一個因素。

4

如上所述,答案將取決於如果在列分隔符的數量是一致的或不變。如果這個數字一致,答案會更直接。這裏有一個答案做建築關閉Andrie的strsplit回答:

dat <- read.csv("yourData.csv", header=FALSE, stringsAsFactors = FALSE) 

#If always going to be a consistent number of separators 
dat <- cbind(dat, do.call("rbind", strsplit(dat[, 3], ":"))) 

     V1  V2  V3  V4 1 2 3 
1 Deamon  Host 1:02:04 aaa.03 1 02 04 
2 Pixe Paradigm 1:03:05 11.us 1 03 05 

注意上面基本上是如何colsplit.character從包reshape實現,可能是更好的選擇適合你,因爲它迫使你給適當的名稱。

如果分隔符的數目不同,則使用rbind.fill是來自程序包plyr的選項。 rbind.fill預計data.frames有點煩人,我不知道如何獲得一行data.frame沒有先轉換爲矩陣,所以我想這可以變得更有效率,但這裏有一個基本的想法:

library(plyr) 
x <- c("1:2:4", "1:3:5:6:7") 
rbind.fill(
    lapply(
    lapply(strsplit(x, ":"), matrix, nrow = 1) 
    , as.data.frame) 
) 

    V1 V2 V3 V4 V5 
1 1 2 4 <NA> <NA> 
2 1 3 5 6 7 

然後可以如上所示編輯cbind