我有一个如下所示的数据框:
compare col1 col2 col3 (...)
1 cat01 bird02 bird03 cat01 (...)
2 bird02 bird03 cat02 dog01 (...)
3 cat02 bird04 horse01 cat06 (...)
4 cat03 cat01 bird04 cat08 (...)
5 dog01 bird02 dog01 bird03 (...)
我想更改col1,col2,col3等中未出现在列&#34中的所有值;比较"到NA。
compare col1 col2 col3
1 cat01 bird02 <NA> cat01
2 bird02 <NA> cat02 dog01
3 cat02 <NA> <NA> <NA>
4 cat03 cat01 <NA> <NA>
5 dog01 bird02 dog01 <NA>
对于类似的情况,我使用了
data$col1[!data$col1 %in% data$compare] <- NA
之前,但我必须手动更改所有列。由于此特定数据框具有大量列,是否可以通过一次比较所有其他列及其值来更快更轻松地实现此目标?
谢谢!
答案 0 :(得分:2)
你可以尝试
df1[-1][!mapply(`%in%`, df1[-1], df1[1])] <- NA
df1
# compare col1 col2 col3
#1 cat01 bird02 <NA> cat01
#2 bird02 <NA> cat02 dog01
#3 cat02 <NA> <NA> <NA>
#4 cat03 cat01 <NA> <NA>
#5 dog01 bird02 dog01 <NA>
或者
df1[-1][`dim<-`(!grepl(paste(df1[,1], collapse="|"),
as.matrix(df1[-1])), dim(df1[-1]))] <- NA
答案 1 :(得分:2)
以下是通过引用更新数据集的可能data.table
解决方案(您可以使用set
和for
循环提高性能,但如果您的数据可能不需要它设置不是太大)
library(data.table)
indx <- unique(df$compare)
setDT(df)[, names(df)[-1] := lapply(.SD, function(x) replace(x, !x %in% indx, NA)), .SDcols = -"compare"][]
# compare col1 col2 col3
# 1: cat01 bird02 NA cat01
# 2: bird02 NA cat02 dog01
# 3: cat02 NA NA NA
# 4: cat03 cat01 NA NA
# 5: dog01 bird02 dog01 NA
答案 2 :(得分:2)
使用dplyr
library(dplyr)
df %>% mutate_each(funs(ifelse(. %in% df[,1], ., NA)), -compare)
你得到:
# compare col1 col2 col3
#1 cat01 bird02 <NA> cat01
#2 bird02 <NA> cat02 dog01
#3 cat02 <NA> <NA> <NA>
#4 cat03 cat01 <NA> <NA>
#5 dog01 bird02 dog01 <NA>
答案 3 :(得分:1)
如果我在R控制台附近,我会尝试
df[ ! df %in% df[[1]] ] <- NA
那应该用矩阵成功但我现在无法测试它。您不需要排除col 1 b / c它们都在col1中。
编辑:嗯,这不起作用,....但如果它是一个字符矩阵...... dat <- as.matrix(df)
dat[ ! dat %in% dat[,1] ] <- NA
dat
#-----------
compare col1 col2 col3
1 "cat01" "bird02" NA "cat01"
2 "bird02" NA "cat02" "dog01"
3 "cat02" NA NA NA
4 "cat03" "cat01" NA NA
5 "dog01" "bird02" "dog01" NA
答案 4 :(得分:1)
您可以使用is.na<-
功能:
is.na(data[-1]) <- matrix(!as.matrix(data[-1]) %in% data$compare, nrow(data))
# compare col1 col2 col3
# 1 cat01 bird02 <NA> cat01
# 2 bird02 <NA> cat02 dog01
# 3 cat02 <NA> <NA> <NA>
# 4 cat03 cat01 <NA> <NA>
# 5 dog01 bird02 dog01 <NA>
答案 5 :(得分:0)
我的方式是:
df[,2:ncol(df)][apply(df[,2:ncol(df)], 2, function(x) x %in% df[,1])==F] <- NA
# compare col1 col2 col3
#1 cat01 bird02 <NA> cat01
#2 bird02 <NA> cat02 dog01
#3 cat02 <NA> <NA> <NA>
#4 cat03 cat01 <NA> <NA>
#5 dog01 bird02 dog01 <NA>