我希望能够替换R中我的data.frame对象中的向量中的元素值的子集。到目前为止我发现的玩具示例很简单(和小)足以手动键入并将要定位的少数元素替换为要替换的元素。虽然这个玩具示例将再次小到足以手动键入目标和替换元素,但我希望它可以作为一个简单的表示,其中有更多唯一名称,但问题仍然存在同样的:
SampleID <- rep(c("Keith", "Mick", "Brian", "Ronnie"), times = 3)
Trial <- sort(rep(c(1,2,3), times = 4))
set.seed(10)
Scores <- sample.int(100, 12)
df <- data.frame(SampleID, Trial, Scores)
现在以此示例为例,扩展它以包含数千个独特的SampleID名称;让我们说这项研究实际上有一个类似5000个独特个体的列表,您的数据集需要重新编码,以便需要重命名100个人。
是否有一种方法可以使用两个向量来表示要用要重新编码的target
名称替换的已识别replacement
名称列表,而无需输入类似的内容:
df$SampleID <- recode(df$SampleID, "Mick" = "jagger", ... 99 other "target" = "replacement" values)
也许诀窍是用for循环进行迭代?
非常感谢。
答案 0 :(得分:1)
我会创建一个命名向量,并将其与forcats::fct_recode
:
library(forcats)
library(dplyr)
names(target) <- replacement
df <- df %>%
mutate(SampleID = fct_recode(SampleID, target))
答案 1 :(得分:0)
我建议您创建一个包含target
和replacement
字段的参考数据框,如下所示:
new_df <- data.frame(target = 'Mick', replacement = 'Jagger')
然后您可以将其合并到当前的df
:
df <- merge(df, new_df, by.x = 'SampleID', by.y = 'target', all.x = TRUE)
然后,只需使用ifelse()
语句将SampleID
中的值替换为replacement
中!is.na(replacement)
所在的值:
df$SampleID <- ifelse(!is.na(df$replacement), df$replacement, df$SampleID)
答案 2 :(得分:0)
明确放入玩具替换载体以使用:
replace_list <- list(target = c('Keith', 'Mick', 'Brian', 'Ronnie'),
replacement = c('Richards', 'Jagger', 'Jones', 'Wood'))
可能有一个更优雅的解决方案,但如果您只想使用字符串向量,可能是一个简单的查找函数,然后您可以映射目标向量的每个元素。
replace_funct <- function(x) {
if (!is.na(replace_list$target[[x]]))
replace_list$replacement[[which(replace_list$target == x)]]
else x
}
library(purrr)
df$NewSampleID <- map_chr(df$SampleID, replace_funct)