首页 > 解决方案 > 在 r Dataframe 中将所有 NA 设置为空白

问题描述

我大部分时间都成功了,但在一种情况下,以下代码会引发错误。

错误:字符串不是标准的明确格式

current[is.na(current)] = ""

以下作品。但是如何避免写 3 次呢?

isnaColumns <- sapply(current, is.character)
current[,isnaColumns] <- lapply(current[,isnaColumns], function(z) replace(z, is.na(z), ""))

isnaColumns <- sapply(current, is.numeric)
current[,isnaColumns] <- lapply(current[,isnaColumns], function(z) replace(z, is.na(z), "" ))

isnaColumns <- sapply(current, is.logical)
current[,isnaColumns] <- lapply(current[,isnaColumns], function(z) replace(z, is.na(z), "" ))

标签: rdataframe

解决方案


我认为更好的方法是只更新对更新有意义的列,例如在character和可能的factor. 前者很简单

ischr <- sapply(current, is.character)
current[,ischr] <- lapply(current[,ischr], function(z) replace(z, is.na(z), ""))

(为之前错误爆炸的代码道歉......)

使用大量数据进行测试:

n <- 1e7 # 10,000,000
set.seed(42) # R-4.0.2
current <- data.frame(
  int=sample(1000, size=n, replace=TRUE),
  chr1=sample(letters, size=n, replace=TRUE),
  chr2=sample(LETTERS, size=n, replace=TRUE),
  chr3=sample(letters, size=n, replace=TRUE),
  chr4=sample(LETTERS, size=n, replace=TRUE),
  chr5=sample(letters, size=n, replace=TRUE),
  chr6=sample(LETTERS, size=n, replace=TRUE)
)
ischr <- sapply(current, is.character)
ischr
#   int  chr1  chr2  chr3  chr4  chr5  chr6 
# FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE 
current[,ischr] <- lapply(current[,ischr], function(z) replace(z, sample(n, size=n/10), NA))
head(current)
#   int chr1 chr2 chr3 chr4 chr5 chr6
# 1 561    y    Z    m    D    y    P
# 2 997    l    D    q <NA>    c    C
# 3 321    z    Q    a    E <NA>    H
# 4 153    n    K <NA>    C    h    P
# 5  74 <NA>    I    t    S    y    N
# 6 228    e    C    s    Z    q    L
system.time({
  current[,ischr] <- lapply(current[,ischr], function(z) replace(z, is.na(z), ""))
})
#    user  system elapsed 
#    0.39    0.06    0.45 
head(current)
#   int chr1 chr2 chr3 chr4 chr5 chr6
# 1 561    y    Z    m    D    y    P
# 2 997    l    D    q         c    C
# 3 321    z    Q    a    E         H
# 4 153    n    K         C    h    P
# 5  74         I    t    S    y    N
# 6 228    e    C    s    Z    q    L

推荐阅读