就性能和代码整洁度而言,跨数据框的不同列替换值的最佳方法是什么?
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.table
、read.csv
、read.fwf
,它被称为na.strings
。在 readr
包中,参数是 na
(如果您担心性能,这会快 很多 )。 data.table::fread
也会很快,并且还有一个 na.strings
参数。
从数据库源,我建议将编码添加到数据库查询本身,但 RODBC::sqlQuery
也会将 na.strings
参数传递给 read.table
。
我目前正在使用 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.table
、read.csv
、read.fwf
,它被称为na.strings
。在 readr
包中,参数是 na
(如果您担心性能,这会快 很多 )。 data.table::fread
也会很快,并且还有一个 na.strings
参数。
从数据库源,我建议将编码添加到数据库查询本身,但 RODBC::sqlQuery
也会将 na.strings
参数传递给 read.table
。