我有一個csv,看起來像集R中數據幀
Deamon,Host,1:2:4,aaa.03
Pixe,Paradigm,1:3:5,11.us
我需要閱讀到這一點進行分析,但在我的數據中的第3列由分隔的數據框:和需要讀取就像一組或列表1.e被分割:以便它返回(1,2,4)。是否有可能在R中有一個列表列。或者你認爲我可以如何最好地解決這個問題。使用gsub來完成替換字符
我有一個csv,看起來像集R中數據幀
Deamon,Host,1:2:4,aaa.03
Pixe,Paradigm,1:3:5,11.us
我需要閱讀到這一點進行分析,但在我的數據中的第3列由分隔的數據框:和需要讀取就像一組或列表1.e被分割:以便它返回(1,2,4)。是否有可能在R中有一個列表列。或者你認爲我可以如何最好地解決這個問題。使用gsub來完成替換字符
您可以使用strsplit
一個字符向量分成組件的列表:
x <- c("1:2:4", "1:3:5")
strsplit(x, split=":")
[[1]]
[1] "1" "2" "4"
[[2]]
[1] "1" "3" "5"
嘗試:
R> str <- "1:2:4"
R> str
[1] "1:2:4"
R> gsub(":", ",", str)
[1] "1,2,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
。
第三列是否總是有三個以冒號分隔的數字?或者它可以有三個以上? –
有時候可能有3個以上的數字 – damola
請參閱我的答案,瞭解不同數量的':'。如果* nix OS在你的庫中,你也可以看看其他的預處理工具來處理它,比如'sed'或'awk'。 – Chase