将特定值保留在数据框中并删除所有其他值

Keep specific values in a dataframe and delete all the others

从这样的数据框开始:

  col1 <- c("Anne", "Emma", "Katy", "Albert", "Richard")
  col2 <- c("Albert", "Mark", "Mike", "Loren", "Anne")
  col3 <- c("Mark", "Emma", "Paul", "George", "Samuel" )
  
  df <- cbind(col1, col2, col3) 

我只想保留此向量中报告的值:

selected <- c("Emma", "Katy", "Mark")

并删除所有其他的,以便有一个像这样的新数据框:

col1    col2    col3
NA      NA      "Mark"
"Emma"  "Mark"  "Emma"
"Katy"  NA      NA
NA      NA      NA
NA      NA      NA

我已经尝试使用以下代码并且有效:

df[df != "Emma" & df != "Katy" & df != "Mark"] <- NA

但我想找到一种在 if 语句中使用向量 selected 的方法,而不是手动编写所有条件。 事实上,我的实际数据框和值向量比这个例子中的要大。

在此先感谢您的帮助!

问题中的代码使用 cbind 创建了一个矩阵,而不是 data.frame。这很重要,因为 df 是具有暗淡属性集的所有相同长度的向量列表,而矩阵是折叠向量,具有暗淡属性集的向量。

  • 对于 data.frames,在其列上使用循环,对每一列应用函数 '%in%'
  • 对于矩阵,不需要循环。
col1 <- c("Anne", "Emma", "Katy", "Albert", "Richard")
col2 <- c("Albert", "Mark", "Mike", "Loren", "Anne")
col3 <- c("Mark", "Emma", "Paul", "George", "Samuel" )

mat <- cbind(col1, col2, col3) 
df <- data.frame(col1, col2, col3) 

selected <- c("Emma", "Katy", "Mark")

is.na(df) <- !sapply(df, `%in%`, selected)
df
#>   col1 col2 col3
#> 1 <NA> <NA> Mark
#> 2 Emma Mark Emma
#> 3 Katy <NA> <NA>
#> 4 <NA> <NA> <NA>
#> 5 <NA> <NA> <NA>

is.na(mat) <- !mat %in% selected
mat
#>      col1   col2   col3  
#> [1,] NA     NA     "Mark"
#> [2,] "Emma" "Mark" "Emma"
#> [3,] "Katy" NA     NA    
#> [4,] NA     NA     NA    
#> [5,] NA     NA     NA

reprex package (v2.0.1)

于 2022-03-20 创建