2015-07-11 49 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教育自己。