R:从所有列中删除某些值

时间:2015-03-08 17:18:15

标签: r

我有一个如下所示的数据框:

  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

之前,但我必须手动更改所有列。由于此特定数据框具有大量列,是否可以通过一次比较所有其他列及其值来更快更轻松地实现此目标?

谢谢!

6 个答案:

答案 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解决方案(您可以使用setfor循环提高性能,但如果您的数据可能不需要它设置不是太大)

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>