首页 > 解决方案 > 如何在 R 中的 data.frame 中查找匹配值的索引

问题描述

假设我有

dat <- as.data.frame(matrix(LETTERS, 10, 5), stringsAsFactors = F)

并且我想将与以下字符向量中的元素匹配的元素替换为vowel

vowels <- c("A", "E", "I", "O", "U")

以下不起作用

dat[dat %in% vowels] <- "vowel"

如果我将它转换dat为矩阵,它会起作用,但由于它的大小和内存问题,它对于我的真实数据是不可行的。

我该如何在 base 和 tidyverse 或 data.table 中进行操作?如果我可以适应多个匹配条件,例如如果我有另一个向量要匹配,则加分。

标签: rdata.tabletidyverse

解决方案


与s/矩阵%in%一起工作。vector根据?"%in%"

x - 向量或 NULL:要匹配的值。支持长向量。

table -vector 或 NULL:要匹配的值。不支持长向量。

而不是data.frame

dat[] <- lapply(dat, function(x) replace(x, x %in%vowels, "vowel"))
dat
#      V1    V2    V3    V4    V5
#1  vowel     K vowel vowel vowel
#2      B     L     V     F     P
#3      C     M     W     G     Q
#4      D     N     X     H     R
#5  vowel vowel     Y vowel     S
#6      F     P     Z     J     T
#7      G     Q vowel     K vowel
#8      H     R     B     L     V
#9  vowel     S     C     M     W
#10     J     T     D     N     X

tidyverse,我们可以使用mutate_all

library(dplyr)
dat <- dat %>%
        mutate_all(~ replace(., . %in% vowels, 'vowel'))

在较新的版本中dplyr,我们可以使用acrosswithmutate

dat <- dat %>%
          mutate(across(everything(), ~ replace(., . %in% vowels, 'vowel')))

如果有多个要比较的集合,请使用case_whenifelse

dat %>%
     mutate_all(~ case_when(. %in% vowels ~ 'vowel', . %in% secondset ~ 'newval', . %in% thirdset ~ 'others'))
  

data.table

library(data.table)
setDT(dat)[, lapply(.SD, function(x) replace(x, x %in% vowels, 'vowel'))]

推荐阅读