tapply中的错误(y,by,sum):级别总数> = 2 ^ 31

时间:2017-12-26 20:33:42

标签: r data-processing

我得到了这个错误背后的主要想法,我的数据太大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矩阵),但不适用于大型数据集

1 个答案:

答案 0 :(得分:0)

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

如果您对您提供的数据集示例应用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个子集(其中一个可以破坏那些更小的集合),这可以让您更好地理解应用规则的数据。人们也可以考虑首先分析较小的集合,然后找到一种简单的方法来组合结果。