【问题标题】:Error in tapply(y, by, sum) : total number of levels >= 2^31tapply(y, by, sum) 中的错误:总层数 >= 2^31
【发布时间】:2018-06-07 13:59:07
【问题描述】:

我明白了这个错误背后的主要思想,我的数据太大了 512218 记录有 3 个变量,我正在尝试将数据框转换为表格格式,以便获得邻接矩阵。现在我正在使用 xtabs 并收到此错误

n <- xtabs(USER_LINK ~ screenName + screen_name_mention, df)

我尝试使用sapply(df,table)(如相关问题中所述),但没有奏效。我想知道是否有另一种方法可以将数据框转换为表格格式而不会出现此错误?

head 的数据

 screenName    screen_name_mention   USER_LINK
1  g_fandos       ecolandlab            1
2 andrewmbrass    PLOSBiology           1
3 andrewmbrass    PLOSBiology           1
4  welloldstem     dbcurren             1
5 PaulJDavison     BehavEcol            1
6  cbjones1943     BiolJLinnSoc¿       1

str(df)

'data.frame':   512218 obs. of  3 variables:
 $ screenName         : Factor w/ 150233 levels "","#$%","#cuttingeeg",..: 50920 8866 8866 145600 106833 23847 23847 98575 98575 61282 ...
 $ screen_name_mention: Factor w/ 150233 levels "","#$%","#cuttingeeg",..: 41276 110025 110025 33531 15579 17454 61209 112371 38473 110091 ...
 $ USER_LINK          : int  1 1 1 1 1 1 1 1 1 1 ...

例子:

 User_name  M_User  Total
   user 1  user 2     7
   user 1  user 3    19
   user 1  user 7     5
   user 3  user 2     1
   user 2  user 7     1

最终结果

User_name user 1 user 2 user 3 user 7
   user 1      0      7     19      5
   user 2      0      0      0      1
   user 3      0      1      0      0
   user 7      0      0      0      0

我的代码适用于像这样的小数据集(甚至创建 5000x5000 矩阵),但不适用于大数据集

【问题讨论】:

  • 请分享您的数据head
  • 现在有问题添加@MKR
  • 谢谢@melissa。您能否也分享str 的数据?
  • 你想从你的数据中获取一个数组吗?
  • 你的邻接矩阵会很大 (150233*150233),所以尝试在xtabs 中设置sparse=TRUE 看看是否有帮助。或者使用igraph创建一个图并输出一个稀疏的adj矩阵??

标签: r data-processing


【解决方案1】:

一种选择是使用tidyr 包中的spread 函数。

如果您在您提供的数据集示例上应用spread 函数:

df <- data.frame(User_name = c("user 1", "user 1", "user 1", "user 3", "user 2"),
                 M_user = c("user 2", "user 3", "user 7", "user 2", "user 7"),
                 Total = c(7, 19, 5, 1, 1)
                 )

>df
User_name  M_User  Total
user 1  user 2     7
user 1  user 3    19
user 1  user 7     5
user 3  user 2     1

#spread will convert the data as below:
> spread(df, M_user, Total)
  User_name user 2 user 3 user 7
1    user 1      7     19      5
2    user 2     NA     NA      1
3    user 3      1     NA     NA

我通常更喜欢在分析过程中横向打断big data,以便更好地了解数据的性质。例如,在 OP 中,数据超过 500+ K,这阻碍了任何分析。我更愿意将数据分成 5 个部分,例如:

df[1:100000,]
df[100001:200000,]
df[200001:300000,]
df[300001:400000,]
df[400001:512218,]

首先分析这 5 个子集(可以将它们分成更小的集合),这可以让您更好地理解数据以应用规则。也可以考虑先分析较小的集合,然后找到一种简单的方法来组合结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2016-05-09
    相关资源
    最近更新 更多