就性能和代码整洁度而言,跨数据框的不同列替换值的最佳方法是什么?

What's the best way of replacing values across different columns of a data frame in terms of performance and code-cleanliness?

我目前正在使用 dplyr 清理数据集,因此我从 data.frame 创建了一个 tbl_df,其列是 chr 的列表。

> class(data)
[1] "tbl_df"     "tbl"        "data.frame"

> lapply(data, class)
$var1
[1] "list"

$var2
[1] "list"

$var3
[1] "list"

$var4
... [and so on...]

> head(data)
Source: local data frame

  var1     var2    ...
1 <chr[1]> <chr[1]>
2 <chr[1]> <chr[1]>

在这些列表中(对应于列 var1、var2 等),有很多像 ".." 这样的字符表示缺失值。

为了清理它,我决定通过以下方式将那些 ".." 转换为 NA:

data[data == ".."] <- NA

句子按预期工作,但没有利用 dplyr 并且执行时间似乎太长。

有没有更好的方法做同样的替换,也许使用dplyr,这样代码运行得更快?

我很确定有一种快速有效的方法可以替换 data.frame / tbl_df.

的所有列(或其中的一个子集)的值

我只是要把我的评论变成一个答案。就代码清洁度而言,填写 NA 值的最佳位置是在您读入它时。它也可能表现得很好。

如果您的数据位于平面文件中,那么无论您以何种方式读取它,都可能有一个参数来确定 NA 值的编码方式。在基数中,例如read.tableread.csvread.fwf,它被称为na.strings。在 readr 包中,参数是 na(如果您担心性能,这会快 很多 )。 data.table::fread 也会很快,并且还有一个 na.strings 参数。

从数据库源,我建议将编码添加到数据库查询本身,但 RODBC::sqlQuery 也会将 na.strings 参数传递给 read.table