[英]R: Delete certain values from all columns
我有一个看起来像这样的数据框:
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等中所有未出现在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
以前,但是我必须手动更改所有列。 由于此特定数据框具有大量列,是否有任何方法可以通过一次比较所有其他列及其值来使其变得更快更容易?
谢谢!
你可以试试
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
这是一个可能的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
使用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>
如果我在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
您可以使用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>
我的方式是:
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.