Как найти индексы для совпадающих значений в data.frame в R - PullRequest
1 голос
/ 30 апреля 2020

Допустим, у меня есть

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

, и я хочу заменить элементы, которые соответствуют элементам в следующем символьном векторе, на vowel

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

, следующее не '

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

работает, если я преобразовываю dat в матрицу, но это невозможно с моими реальными данными из-за проблем с размером и памятью.

Как мне go о том, как делать это в базе и Tidyverse или data.table? Плюс за то, что я могу соответствовать нескольким условиям сопоставления, например, если у меня есть другой вектор для сопоставления.

1 Ответ

1 голос
/ 30 апреля 2020

%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 мы можем использовать across с mutate

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

Если есть несколько наборов для сравнения, используйте case_when или ifelse

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'))]
...