r - 在 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), "" ))
解决方案
我认为更好的方法是只更新对更新有意义的列,例如在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
推荐阅读
- react-native - React-native 没有将组件识别为组件
- swift - Swift:选择扩展中定义的类型特定方法实现?
- java - 为什么我会收到“java.lang.RuntimeException:无法启动活动 ComponentInfo”错误?
- node.js - WooCommerce Rest API 创建 Webhooks
- python - 如何在不创建新环境的情况下从一个文件在 conda 中安装多个包?
- python - 无法理解元素交换(python 列表)
- javascript - 如何使用 Puppeteer 暂停并等待用户输入?
- javascript - 如何在站点后将浏览器窗口大小调整为 75%
- mysql - MySQL查询列出每个用户在几个表中出现的次数
- ruby - 如何以编程方式设置 content_security_policy?