首先,我建议不要使用组合data.frame(cbind(...))
。原因如下:cbind
默认情况下会创建一个matrix
,如果你只传入 atomic vectors 给它。在 R 中,矩阵只能有一种类型的数据(把矩阵看作是具有维数属性的向量,即行数和列数)。因此,你的代码
cbind(c("USD","MYR"),c(0.9,1.1))
创建一个字符矩阵:
str(cbind(c("USD","MYR"),c(0.9,1.1)))
尽管你可能期望得到一个最终的数据框,其中包含一个字符或因子列(rate)和一个数字列(value)。但实际上你得到的是:
str(data.frame(cbind(c("USD","MYR"),c(0.9,1.1))))
因为默认情况下使用 data.frame
时会将字符串(字符)转换为因子(factor)(您可以通过在 data.frame()
调用中指定 stringsAsFactors = FALSE
来规避这一问题)。
我建议采用以下替代方法创建样本数据(同时还请注意,您可以在同一调用中轻松地指定列名):
lookup <- data.frame(rate = c("USD","MYR"),
value = c(0.9,1.1))
fx <- data.frame(rate = c("USD","MYR","USD","MYR","XXX","YYY"))
现在,针对您的实际问题,如果我理解正确的话,您想要用 1
替换连接数据中的所有 NA
。如果是这样的话,下面是使用 left_join
和 mutate_each
进行操作的自定义函数:
library(dplyr)
left_join_NA <- function(x, y, ...) {
left_join(x = x, y = y, by = ...) %>%
mutate_each(funs(replace(., which(is.na(.)), 1)))
}
现在,您可以像这样将其应用于您的数据:
> left_join_NA(x = fx, y = lookup, by = "rate")
注意,您将得到一个字符列(rate)和一个数字列(value),所有的NAs都将被替换为1。
str(left_join_NA(x = fx, y = lookup, by = "rate"))
mutate(across(where(is.numeric), coalesce, 0))
- merv