用来自其他向量的值替换一个向量中的值 数据

问题描述

我有一个数据框:

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,我们可以将 invokecoalesce 一起使用

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