我有一个名为“mat”的大型数据框,包含49952个观测值和7597个变量,我正在尝试用零替换NAs。以下是我的数据框的示例:
A B C E F D Q Z . . .
1 1 1 0 NA NA 0 NA NA
2 0 0 1 NA NA 0 NA NA
3 0 0 0 NA NA 1 NA NA
4 NA NA NA NA NA NA NA NA
5 0 1 0 1 NA 0 NA NA
6 1 1 1 0 NA 0 NA NA
7 0 0 1 0 NA 1 NA NA
.
.
.
我需要一个非常快的工具来替换它们。结果应该是这样的:
A B C E F D Q Z . . .
1 1 1 0 0 0 0 0 0
2 0 0 1 0 0 0 0 0
3 0 0 0 0 0 1 0 0
4 0 0 0 0 0 0 0 0
5 0 1 0 1 0 0 0 0
6 1 1 1 0 0 0 0 0
7 0 0 1 0 0 1 0 0
.
.
.
我已经尝试过lapply(mat,function(x){replace(x,is.na(x),0)})
- 没有生效 - mat[is.na(mat)] < -0
- 错误和可能太慢 - 还有一个链接 - 也没用。
@Sotos已经建议我使用plyr::rbind.fill(lapply(L,as.data.frame))
,但这并没有起作用,因为它会生成379485344个观测值和1个变量的数据框(即49952x7597),所以我还必须将其转换回来。有没有更好的方法来做到这一点?
我的数据框的真正结构:
> str(mat)
'data.frame': 49952 obs. of 7597 variables:
$ 6794602 : num 1 NA NA NA NA 0 0 0 0 0 ...
$ 1008667 : num NA 1 0 NA NA 0 0 0 0 0 ...
$ 8009082 : num NA 0 1 NA NA NA NA NA NA NA ...
$ 6740421 : num NA NA NA 1 NA 0 0 0 0 0 ...
$ 6777805 : num NA NA NA NA 1 NA NA NA NA NA ...
$ 1001682 : num NA NA NA NA NA 0 0 0 0 0 ...
$ 1001990 : num NA NA NA NA NA 0 0 0 0 0 ...
$ 1002541 : num NA NA NA NA NA 0 0 0 0 0 ...
$ 1002790 : num NA NA NA NA NA 0 0 0 0 0 ...
注意:
当我尝试使用 mat[is.na(mat)] <- 0
时,会出现警告:
> mat[is.na(mat)] <- 0
Warning messages:
1: In `[<-.factor`(`*tmp*`, thisvar, value = 0) :
invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, thisvar, value = 0) :
invalid factor level, NA generated
> nlevels(mat)
[1] 0
使用
mat[is.na(mat)] <- 0
后的数据框 mat:> str(mat)
'data.frame': 49952 obs. of 7597 variables:
$ 6794602 : num 1 0 0 0 0 0 0 0 0 0 ...
$ 1008667 : num 0 1 0 0 0 0 0 0 0 0 ...
$ 8009082 : num 0 0 1 0 0 0 0 0 0 0 ...
$ 6740421 : num 0 0 0 1 0 0 0 0 0 0 ...
$ 6777805 : num 0 0 0 0 1 0 0 0 0 0 ...
$ 1001682 : num 0 0 0 0 0 0 0 0 0 0 ...
$ 1001990 : num 0 0 0 0 0 0 0 0 0 0 ...
$ 1002541 : num 0 0 0 0 0 0 0 0 0 0 ...
$ 1002790 : num 0 0 0 0 0 0 0 0 0 0 ...
所以问题是:
- 还有其他快速替换NA的方法吗?
- 这个警告有多大关系?因为使用
mat[is.na(mat)] <- 0
后的数据看起来像我想要的,但数值太多,所以我无法检查它们是否正确。
mat[is.na(mat)] = 0
应该是最快的方法,毫无疑问(对于密集矩阵来说)。如果不是这样,那在R中是一个显眼的错误…… - Konrad RudolphView(mat [sapply(mat,is.factor)])
或者使用str
代替View
。 - Frankstr(mat)
的输出,没有任何因素。但警告消息与该输出不符。 - Konrad Rudolphstr(as.data.frame(replicate(7597, 1, simplify=FALSE)))
-- 首先,OP 给我们展示的比他们看到的少;其次,即使完整显示输出,也无法显示所有 7597 列。总之,当 OP 只提供数据的一瞥而不是一个好的例子时,我们无法确定。 - Frank'data.frame': 199235 obs. of 3 variables: $ Invoice_Date: Factor w/ 627 levels $ SKU : Factor w/ 53113 levels $ CustomerID : Factor w/ 55945 levels
我将其拆分为627个数据框,根据Invoice_Date使用droplevels进行简化计算,然后在列中制作SKU的频率数据框,在行中制作CustomerID的频率数据框,最后使用mat <- rbindlist(cop.data1, fill=T)
将其重新组合(我不需要CusotmerID),结果获得了数据框 mat。 - Martina Zapletalová