在 R 中将非矩形数据导入为矩形
Importing non-rectangular data as rectangular in 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
的列。
相关问题here, and .
这是读取行,然后将它们一一解析为两个列矩阵。这确实会产生字符值(因为文本行只是字符)但是强制转换为数字是微不足道的:
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
.
自我教育
如果你真的有一个冒号作为分隔符,那么只需使用 read.table
和 header = FALSE
将你的数据导入 R,然后考虑使用我的 "splitstackshape" 中的 cSplit
] 包。
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
我需要加载社交网络数据,其中每个用户都有未知且可能有大量朋友,存储为以下格式的文本文件:
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
的列。
相关问题here, and
这是读取行,然后将它们一一解析为两个列矩阵。这确实会产生字符值(因为文本行只是字符)但是强制转换为数字是微不足道的:
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
.
如果你真的有一个冒号作为分隔符,那么只需使用 read.table
和 header = FALSE
将你的数据导入 R,然后考虑使用我的 "splitstackshape" 中的 cSplit
] 包。
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