为什么replace函数可以在r中的数据帧上工作,而不能在TIBLES上工作?

为什么replace函数可以在r中的数据帧上工作,而不能在TIBLES上工作?,r,dataframe,tibble,R,Dataframe,Tibble,我查看了讨论,以了解为什么replace\u na函数(如下所示)可以在数据帧上工作,但不能在TIBLES上工作。你能帮我理解为什么它不能在tibbles上工作吗?如何修改该函数,使其既适用于data.frame又适用于tible 资料 谢谢。is.na()返回数据帧的逻辑矩阵: is.na(df1) #>id性别等级年龄 #>[1,]假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假 #>[2,]假假假真 #>[3,]假-真-假 #>[

我查看了讨论,以了解为什么
replace\u na
函数(如下所示)可以在数据帧上工作,但不能在TIBLES上工作。你能帮我理解为什么它不能在tibbles上工作吗?如何修改该函数,使其既适用于
data.frame
又适用于
tible

资料 谢谢。

is.na()
返回数据帧的逻辑矩阵:

is.na(df1)
#>id性别等级年龄
#>[1,]假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假
#>[2,]假假假真
#>[3,]假-真-假
#>[4]假假假真
基本
data.frame
类支持使用矩阵进行子集设置
tbl_df
更为严格,而且没有

as.data.frame(df2)[is.na(df1)]
#>[1]“M”“A”“B”“NG”“23”“19”
df2[is.na(df1)]
#>必须使用“[”中的向量,而不是类矩阵的对象。
要使您的
replace_na()
函数与
tbl_df
一起工作,您需要对每个列分别执行操作。例如,使用递归:

替换a id性别等级年龄
#>       
#>1米A 2
#>2 F A 23
#>3米B 2
#>4 F NG 19
这种方法通常也更快:

replace\u na\u vec
#>1新的74.01us 97.79us 7295.0B 12.6
#>2旧的269.97us 529.93us 1845.81.02KB 8.23
#>3个新的10k 1.82ms 2.75ms 338.4.27MB 32.3
#>4旧10k 94.29ms 104.05ms 9.68 10.24MB 2.42

由(v0.3.0)于2019年9月12日创建

谢谢@Mikko,虽然这不是问题的一部分,但我想知道,与使用
as.data.frame
强制执行
arglist
相比,单独执行如何影响性能?@deepseefan我添加了一个快速基准:看起来单独的方法通常比使用
as.data.fram的矩阵子集更快e()
library(dplyr)

#dput(df1)
df1 <- structure(list(id = c(1, 2, 3, 4), gender = c("M", "F", NA, "F"
), grade = c("A", NA, NA, NA), age = c(2, NA, 2, NA)), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))

#dput(df2)
df2 <- structure(list(id = c(1, 2, 3, 4), gender = c("M", "F", "M", 
"F"), grade = c("A", "A", "B", "NG"), age = c(22, 23, 21, 19)), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))