簡體   English   中英

如何在R中“替換”(或等效功能)以獲得較長列表

[英]how to `replace` (or equivalent function) in R for long lists

我希望能夠替換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名稱的列表,這些target名稱要使用您要重新編碼的replacement名稱,而不必鍵入以下內容:

df$SampleID <- recode(df$SampleID, "Mick" = "jagger", ... 99 other "target" = "replacement" values)

也許訣竅是使用for循環進行迭代?

非常感謝。

我將創建一個命名向量,並將其與forcats::fct_recode

library(forcats)
library(dplyr)

names(target) <- replacement 

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

我建議創建一個包含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)

明確放入玩具替換向量以進行操作:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM