在R中将非矩形数据导入为矩形

Posted

技术标签:

【中文标题】在R中将非矩形数据导入为矩形【英文标题】:Importing non-rectangular data as rectangular in R 【发布时间】:2015-07-11 02:23:56 【问题描述】:

我需要加载社交网络数据,其中每个用户都有未知且可能有大量朋友,存储为以下格式的文本文件:

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和here。

【问题讨论】:

【参考方案1】:

如果你真的有一个冒号作为分隔符,那么只需使用read.tableheader = 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

【讨论】:

【参考方案2】:

这会读取行,然后将它们一一解析为两个列矩阵。这确实会产生字符值(因为文本行只是字符)但是强制转换为数字是微不足道的:

 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 进行自我教育。

【讨论】:

以上是关于在R中将非矩形数据导入为矩形的主要内容,如果未能解决你的问题,请参考以下文章

R中数据结构

Java:如何用导入的 PNG 文件替换“椭圆”或“矩形”图形?

如何使用gnuplot将非矩形和未网格化数据显示为地图?

R语言使用treemap包中的treemap函数可视化treemap图:treemap将分层数据显示为一组嵌套矩形,每一组都用一个矩形表示,该矩形的面积与其值成正比

R语言ggplot2可视化:可视化Treemap图treemap将分层数据显示为一组嵌套矩形,每一组都用一个矩形表示,该矩形的面积与其值成正比(Treemap)

创建非矩形窗体