r语言 - 如何替换多个列中不属于另一个列中的值的所有值



我有一个数据集,其中一个变量具有参与者id,几个变量具有同行提名(以id的形式)。

我需要将同行提名变量中不属于参与者id的所有数字替换为NA。

示例:I have

ID       PN1       PN2
1         2         5
2         3         4
4         6         2      
5         2         7

我需要

ID       PN1       PN2
1         2         5
2         NA        4
4         NA        2      
5         2         NA

如果有人能帮忙就太好了!提前谢谢你。

Base R的替代,

df[,-1][matrix(!(unlist(df[,-1]) %in% df[,1]),nrow(df))] <- NA
df

,

ID PN1 PN2
1  1   2   5
2  2  NA   4
3  4  NA   2
4  5   2  NA
library(tidyverse)
df %>%
mutate(across(-ID, ~if_else(. %in% ID, ., NA_real_)))

给了:

#   ID PN1 PN2
# 1  1   2   5
# 2  2  NA   4
# 3  4  NA   2
# 4  5   2  NA

数据使用:

df <- data.frame(ID = c(1, 2, 4, 5),
PN1 = c(2, 3, 6, 2),
PN2 = c(5, 4, 2, 7))

这是一个基本的R方式。
除id列外的所有列上的lapply循环使用is.na<-函数将NA值分配给不在df1[[1]]中的向量元素。然后返回改变后的向量。

df1[-1] <- lapply(df1[-1], function(x){
is.na(x) <- !x %in% df1[[1]]
x
})
df1
#  ID PN1 PN2
#1  1   2   5
#2  2  NA   4
#3  4  NA   2
#4  5   2  NA

dput格式数据

df1 <-
structure(list(ID = c(1L, 2L, 4L, 5L), 
PN1 = c(2L, NA, NA, 2L), PN2 = c(5L, 4L, 2L, NA)), 
row.names = c(NA, -4L), class = "data.frame")

我们可以使用mutatecase_when:

library(dplyr)
df %>% 
mutate(across(starts_with("PN"), ~case_when(!(. %in% ID) ~ NA_real_,
TRUE ~ as.numeric(.))))

输出:

# A tibble: 4 x 3
ID   PN1   PN2
<int> <dbl> <dbl>
1     1     2     5
2     2    NA     4
3     4    NA     2
4     5     2    NA

带数据。表中可以(1)对每个列应用fifelse()函数您已经选择了.SD&.SDcols.

require(data.table)
cols = grep('PN', names(df)) # column indices (or names)
df[ , lapply(.SD, function(x) fifelse(!x %in% ID, NA_real_, x)),
.SDcols = cols ]

数据来自@deschen:

df = data.frame(ID = c(1, 2, 4, 5),
PN1 = c(2, 3, 6, 2),
PN2 = c(5, 4, 2, 7))
setDT(df)

最新更新