gpt4 book ai didi

r - dplyr join 定义 NA 值

转载 作者:行者123 更新时间:2023-12-03 13:27:31 26 4
gpt4 key购买 nike

我可以在 dplyr join 中为 NA 定义“填充”值吗?例如在连接中定义所有 NA 值都应该是 1?

require(dplyr)
lookup <- data.frame(cbind(c("USD","MYR"),c(0.9,1.1)))
names(lookup) <- c("rate","value")
fx <- data.frame(c("USD","MYR","USD","MYR","XXX","YYY"))
names(fx)[1] <- "rate"
left_join(x=fx,y=lookup,by=c("rate"))

上面的代码将为值“XXX”和“YYY”创建 NA。在我的情况下,我加入了大量的列,并且会有很多不匹配的。所有非匹配项都应具有相同的值。我知道我可以分几个步骤完成,但问题是所有步骤都可以完成吗?
谢谢!

最佳答案

首先,我建议不要使用组合 data.frame(cbind(...)) .原因如下:cbind创建一个 matrix默认情况下,如果您只将原子向量传递给它。 R 中的矩阵只能有一种类型的数据(将矩阵视为具有维度属性的向量,即行数和列数)。因此,您的代码

cbind(c("USD","MYR"),c(0.9,1.1))

创建一个字符矩阵:
str(cbind(c("USD","MYR"),c(0.9,1.1)))
# chr [1:2, 1:2] "USD" "MYR" "0.9" "1.1"

尽管您可能期望最终数据框带有字符或因子列(比率)和数字列(值)。但你得到的是:
str(data.frame(cbind(c("USD","MYR"),c(0.9,1.1))))
#'data.frame': 2 obs. of 2 variables:
# $ X1: Factor w/ 2 levels "MYR","USD": 2 1
# $ X2: Factor w/ 2 levels "0.9","1.1": 1 2

因为在使用 data.frame 时,字符串(字符)被转换为因子默认情况下(您可以通过在 stringsAsFactors = FALSE 调用中指定 data.frame() 来规避此问题)。

我建议使用以下替代方法来创建示例数据(另请注意,您可以在同一调用中轻松指定列名):
lookup <- data.frame(rate = c("USD","MYR"), 
value = c(0.9,1.1))

fx <- data.frame(rate = c("USD","MYR","USD","MYR","XXX","YYY"))

现在,对于您的实际问题,如果我理解正确,您想替换所有 NA s 带有 1在加入的数据中。如果这是正确的,这里有一个使用 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
#1 USD 0.9
#2 MYR 1.1
#3 USD 0.9
#4 MYR 1.1
#5 XXX 1.0
#6 YYY 1.0
#Warning message:
#joining factors with different levels, coercing to character vector

请注意,您最终会得到一个字符列(rate)和一个数字列(value),并且所有 NA 都被替换为 1。
str(left_join_NA(x = fx, y = lookup, by = "rate"))
#'data.frame': 6 obs. of 2 variables:
# $ rate : chr "USD" "MYR" "USD" "MYR" ...
# $ value: num 0.9 1.1 0.9 1.1 1 1

关于r - dplyr join 定义 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28992362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com