2015-07-11 79 views
2

我需要加載,其中每個用戶具有未知的和潛在的大量的朋友的社交網絡數據,存儲爲以下格式的文本文件:導入非矩形數據作爲矩形中的R

UserId: FriendId1, FriendId2, ... 
1: 12, 33 
2: 
3: 4, 6, 10, 15, 16 

成兩列data.frame:

UserId FriendId 
1  1  12 
2  1  33 
3  3  4 
4  3  6 
5  3  10 
6  3  15 
7  3  16 

你會怎麼做,在R'

讀取,填充然後重新整形效率不高,因爲它需要在內存中保存許多滿欄NA

相關問題herehere

回答

5

如果你真的有一個冒號作爲分隔符,那麼就使用read.tableheader = FALSE讓您的數據轉化爲R,則可以考慮使用cSplit從我的「splitstackshape」包。

mydf <- read.table("test.txt", sep = ":", header = FALSE) 
mydf 
## V1    V2 
## 1 1   12, 33 
## 2 2     
## 3 3 4, 6, 10, 15, 16 

library(splitstackshape) 
cSplit(mydf, "V2", ",", "long") 
## V1 V2 
## 1: 1 12 
## 2: 1 33 
## 3: 3 4 
## 4: 3 6 
## 5: 3 10 
## 6: 3 15 
## 7: 3 16 
3

這會讀取這些行,然後逐個將它們解析爲兩個列矩陣。這確實產生字符值(因爲文本行只是個字符),但它是微不足道的要挾到數字:

do.call(rbind, sapply(rLines, function(L) { n <- sub(":.+", "", L); 
     items <- scan(text=sub(".+:","",L), sep=","); 
    matrix(c(rep(n, length(items)), items), ncol=2)} 
         ) 
      ) 
#--------- 
    [,1] [,2] 
[1,] "1" "12" 
[2,] "1" "33" 
[3,] "3" "4" 
[4,] "3" "6" 
[5,] "3" "10" 
[6,] "3" "15" 
[7,] "3" "16" 

如果前進的道路是不平凡的你,然後在?as.numeric?as.data.frame教育自己。