如何在R中为长列表“替换”(或等效函数)

时间:2018-03-21 13:58:18

标签: r recode

我希望能够替换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循环进行迭代?

非常感谢。

3 个答案:

答案 0 :(得分:1)

我会创建一个命名向量,并将其与forcats::fct_recode

一起使用
library(forcats)
library(dplyr)

names(target) <- replacement 

df <- df %>%
   mutate(SampleID = fct_recode(SampleID, target))

答案 1 :(得分:0)

我建议您创建一个包含targetreplacement字段的参考数据框,如下所示:

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)