2015-07-11 2 views
2

нужно загрузить данные социальной сети, в которой каждый пользователь имеет неизвестный и потенциально большое количество друзей, которые хранятся в виде текстового файла в следующем формате:Импорт непрямоугольной данных в виде прямоугольных в R

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

в двухстоечные данные.

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.

Связанные вопросы here, и here.

ответ

5

Если у вас действительно есть двоеточие в качестве разделителя, а затем просто использовать read.table с header = 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.