r - 如何在 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 中进行操作?如果我可以适应多个匹配条件,例如如果我有另一个向量要匹配,则加分。
解决方案
与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
,我们可以使用across
withmutate
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'))]
推荐阅读
- javascript - 如何使用 eval 或 Function 执行匿名函数
- shell - 使用包含特殊字符(例如“\”、“:”、“;”)的其他文件列表过滤文件 在 Linux 中
- javascript - Kotlin 类型具体化如何在 kotlin-js 上工作?
- php - 通过 FromSubmit (PHP) 创建变量
- fish - 确定特殊输入函数的现有绑定
- ios - 解密 AES/GCM/PKCS5Padding iOS Swift
- java - 来自先前过滤页面的 findElement 返回相同的结果
- javascript - 以价格格式输出数值
- spring - spring简单websocket项目返回200代码
- python - 如何在 FloPy 中添加河流?