问题描述
id <- c(1,2,3,4,5,6,7)
var1 <- c(1,NA,1,2)
var2 <- c(1,2)
但是,我如何设法创建一个新的向量,它从 var2 中获取值,并用 var1 中的 NA 替换它,否则只从 var1 中获取值(1 或 2),只要它有一个值?
我在想:
id <- c(1,2)
newvar <- c(1,2)
另一个数据帧也是如此,其中有更多的向量:
id <- c(1,2)
var3 <- c(2,2)
var4 <- c(1,2)
在这种情况下,我想创建另一个向量“newvar”,它从 var2、var3 和 var4 中获取主导值,并将其替换为 var1 中的 NA。
所以起点将始终是 var1 中的内容。然而,对于 id4 和 id5 fx,其他变量中没有显性值 - 然后我想用第一个变量中的值替换 NA 值,在这两种情况下分别来自 var 2 和 var3 的值。
id <- c(1,2)
如何以简单的方式做到这一点?
谢谢!
解决方法
可以在 [<-
中使用 Reduce
用下一个向量的值覆盖 NA
。
var1 <- c(1,NA,2,1,2)
var2 <- c(1,2)
#`[<-`(var1,is.na(var1),var2[is.na(var1)]) #In case of only two vectors
Reduce(function(a,b) `[<-`(a,is.na(a),b[is.na(a)]),list(var1,var2))
#[1] 1 1 2 2 1 1 2
var1 <- c(1,2)
var3 <- c(2,2)
var4 <- c(1,2)
Reduce(function(a,var2,var3,var4))
#[1] 1 1 2 2 1 1 2
在某种程度上喜欢做什么:
var1 <- c(1,2)
newvar <- var1
i <- is.na(newvar)
newvar[i] <- var2[i]
newvar
#[1] 1 1 2 2 1 1 2
,
试试这个。
df %>%
mutate(newavar = coalesce(var1,var4))
,
您可以使用 coalesce
中的 dplyr
。
library(dplyr)
df$newvar <- do.call(coalesce,select(df,starts_with('var')))
df
# id var1 var2 var3 var4 newvar
#1 1 1 1 2 1 1
#2 2 NA 1 1 1 1
#3 3 2 2 2 2 2
#4 4 NA 2 1 NA 2
#5 5 NA NA 1 2 1
#6 6 1 2 1 1 1
#7 7 2 2 2 2 2
数据
id <- c(1,3,4,5,6,7)
var1 <- c(1,2)
df <- data.frame(id,var1,var4)
,
使用 tidyverse
,我们可以将 invoke
与 coalesce
一起使用
library(dplyr)
library(purrr)
df %>%
mutate(newvar = invoke(coalesce,select(cur_data(),starts_with('var'))))
id var1 var2 var3 var4 newvar
1 1 1 1 2 1 1
2 2 NA 1 1 1 1
3 3 2 2 2 2 2
4 4 NA 2 1 NA 2
5 5 NA NA 1 2 1
6 6 1 2 1 1 1
7 7 2 2 2 2 2
数据
df <- structure(list(id = c(1,7),var1 = c(1,2),var2 = c(1,var3 = c(2,var4 = c(1,2)),class = "data.frame",row.names = c(NA,-7L))
,
使用 pmin
+ col
的基本 R 选项
df$newvar <- df[-1][
cbind(
1:nrow(df),do.call(
pmin,data.frame(
replace(
u <- (!is.na(df[-1])) * col(df[-1]),u == 0,Inf
)
)
)
)
]
给予
> df
id var1 var2 var3 var4 newvar
1 1 1 1 2 1 1
2 2 NA 1 1 1 1
3 3 2 2 2 2 2
4 4 NA 2 1 NA 2
5 5 NA NA 1 2 1
6 6 1 2 1 1 1
7 7 2 2 2 2 2