快速更换 NA - 错误或警告
Quick replace of NA - an error or warning
我有一个很大的 data.frame,叫做 "mat",有 49952 个 obs。 7597 个变量,我试图用零替换 NA。这是我的 data.frame 的示例:
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
- 错误而且可能太慢了 - 而且 link - 也没用.
@Sotos 已经建议我 plyr::rbind.fill(lapply(L, as.data.frame))
但它没有用,因为它使 data.frame 的 379485344 个观察值和 1 个变量(即 49952x7597)所以我还必须将其转换回来。有没有更好的方法来做到这一点?
我的真实结构data.frame:
> 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
Data.frame 使用后垫子 mat[is.na(mat)] <- 0
:
> 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
后的数据看起来是我想要的,但是数值太多了,没法检查是否都对。
如果怀疑您的某些列是因子,可以使用以下代码检测并将它们更改为数字。
inx <- sapply(mat, inherits, "factor")
mat[inx] <- lapply(mat[inx], function(x) as.numeric(as.character(x)))
然后尝试以下操作。
mat[] <- lapply(mat, function(x) {x[is.na(x)] <- 0; x})
mat
这是数据。
mat <-
structure(list(A = c(1L, 0L, 0L, NA, 0L, 1L, 0L), B = c(1L, 0L,
0L, NA, 1L, 1L, 0L), C = c(0L, 1L, 0L, NA, 0L, 1L, 1L), E = c(NA,
NA, NA, NA, 1L, 0L, 0L), F = c(NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_), D = c(0L, 0L, 1L, NA,
0L, 0L, 1L), Q = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_), Z = c(NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_)), .Names = c("A", "B", "C", "E",
"F", "D", "Q", "Z"), row.names = c("1", "2", "3", "4", "5", "6",
"7"), class = "data.frame")
尝试以下操作:
mat %>% replace(is.na(.), 0)
看我的详细回答here。
#install.packages("xlsx")
library(xlsx)
extracted_df <- read.xlsx("test.xlsx", sheetName='Sheet1', stringsAsFactors=FALSE)
# Replace all NAs in a data frame with "G" character
extracted_df[is.na(extracted_df)] <- "G"
我有一个很大的 data.frame,叫做 "mat",有 49952 个 obs。 7597 个变量,我试图用零替换 NA。这是我的 data.frame 的示例:
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
- 错误而且可能太慢了 - 而且 link - 也没用.
@Sotos 已经建议我 plyr::rbind.fill(lapply(L, as.data.frame))
但它没有用,因为它使 data.frame 的 379485344 个观察值和 1 个变量(即 49952x7597)所以我还必须将其转换回来。有没有更好的方法来做到这一点?
我的真实结构data.frame:
> 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
Data.frame 使用后垫子 mat[is.na(mat)] <- 0
:
> 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
后的数据看起来是我想要的,但是数值太多了,没法检查是否都对。
如果怀疑您的某些列是因子,可以使用以下代码检测并将它们更改为数字。
inx <- sapply(mat, inherits, "factor")
mat[inx] <- lapply(mat[inx], function(x) as.numeric(as.character(x)))
然后尝试以下操作。
mat[] <- lapply(mat, function(x) {x[is.na(x)] <- 0; x})
mat
这是数据。
mat <-
structure(list(A = c(1L, 0L, 0L, NA, 0L, 1L, 0L), B = c(1L, 0L,
0L, NA, 1L, 1L, 0L), C = c(0L, 1L, 0L, NA, 0L, 1L, 1L), E = c(NA,
NA, NA, NA, 1L, 0L, 0L), F = c(NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_), D = c(0L, 0L, 1L, NA,
0L, 0L, 1L), Q = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_), Z = c(NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_)), .Names = c("A", "B", "C", "E",
"F", "D", "Q", "Z"), row.names = c("1", "2", "3", "4", "5", "6",
"7"), class = "data.frame")
尝试以下操作:
mat %>% replace(is.na(.), 0)
看我的详细回答here。
#install.packages("xlsx")
library(xlsx)
extracted_df <- read.xlsx("test.xlsx", sheetName='Sheet1', stringsAsFactors=FALSE)
# Replace all NAs in a data frame with "G" character
extracted_df[is.na(extracted_df)] <- "G"