繁体   English   中英

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

[英]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解决方案,用于通过引用更新数据集(您可以使用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

使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM