[英]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.