【问题标题】:R - how to convert long-data dataframe to sparse matrixR - 如何将长数据数据帧转换为稀疏矩阵
【发布时间】:2017-03-12 17:21:09
【问题描述】:

我有一个大数据框,305k 行,有两个键和一个数据列,如下所示:

我正在尝试使用 R 中的以下代码将其转换为稀疏矩阵:

#convert to factors
data$RID   = as.factor(data$RID)
data$HID   = as.factor(data$HID)
data$VALUE = as.numeric(data$VALUE)
str(data)

#remove nas
data = na.omit(data)

#create sparse matrix
X = with(data,sparseMatrix(i=RID, 
                           j=HID, 
                           x=VALUE,
                           dimnames=list(levels(RID), levels(HID))))

这会产生以下错误消息:

Error in sparseMatrix(i = RID, j = HID, x = VALUE, dimnames = list(levels(RID),  : 
  NA's in (i,j) are not allowed
In addition: Warning messages:
1: In Ops.factor(i, !(m.i || i1)) : ‘+’ not meaningful for factors
2: In Ops.factor(j, !(m.j || i1)) : ‘+’ not meaningful for factors

我已经删除了 NA,所以我不确定为什么会出现错误 NA? 它还参考了因子中的“+”,但我检查了所有 36k 因子并且那里没有“+”?

有谁知道解决方法是什么?

我在下面提供了前 20 行数据的快照,以便您重现该问题:

"RID" "HID" "VALUE"
"361838" "620631" 76.55
"361838" "620671" 82.61
"361838" "620787" 57.73
"361838" "621146" 58.65
"361838" "637825" 64.15
"361838" "637859" 82.79
"361838" "641254" 50.38
"361838" "642105" 72.88
"361838" "646469" 45.79
"361838" "648400" 82.06
"395855" "301340" -5.12
"395855" "649304" 41.88
"395855" "650324" -30.83
"395855" "657458" 46.47
"395855" "658028" -0.53
"395855" "659504" 28.84
"395855" "660506" 29.03
"395855" "660519" 14.16
"395855" "660521" -38.17
"395855" "660547" 35.45

虽然当我查看这些因素时,我得到以下信息:

> str(data)
'data.frame':   20 obs. of  3 variables:
 $ RID  : Factor w/ 30608 levels "361838","395855",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ HID  : Factor w/ 37399 levels "2018","7990",..: 11604 11624 11709 11740 14031 14049 15086 15457 16821 17270 ...
 $ VALUE: num  76.5 82.6 57.7 58.6 64.2 ...

【问题讨论】:

  • 您能告诉我们str(data)str(X) 报告的内容吗?如果您提供数据样本,例如dput(head(data, 20)) 以便我们重现您的问题,这将很有帮助。一种可能性是RIDHID 不是因素。
  • 请编辑您的问题以包含其他信息,而不是在 cmets 中发布它们。如果您已通过将列转换为因子来更新数据,请同时编辑您的问题以反映您遇到的新错误。展示如何移除 NA 也很有用。
  • 我现在已经将 RID 和 HID 转换为因子,并按照第一个建议删除了任何 NA。我已重新编辑问题以显示当前问题和错误

标签: r matrix dataframe sparse-matrix reshape


【解决方案1】:

尝试在对sparseMatrix 的调用中将RIDHID 转换为数字:

X <- with(data, sparseMatrix(i=as.numeric(RID), 
                       j=as.numeric(HID), 
                       x=as.numeric(VALUE),
                       dimnames=list(levels(RID), levels(HID))))

RIDHID在调用sparseMatrix时需要先转换成因数,再转换成数值,否则sparseMatrix会取RIDHID的值作为行/列的索引。换句话说,

test <- data.frame(x = 101:105, y = 201:205, v = 1:25)
dim(with(test, sparseMatrix(i = x, j = y, x = v)))
# [1] 105 205

为您提供 105 x 205 矩阵,尽管我们的想法是将 xy 视为键,但只是一个 5 x 5 矩阵。

【讨论】:

    猜你喜欢
    • 2016-08-03
    • 2015-01-16
    • 1970-01-01
    • 2013-12-25
    • 2016-09-19
    • 2021-02-01
    • 2020-11-25
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多