簡體   English   中英

基於列表(哈希)替換R中的向量值

[英]Replacing vector values in R based on a list (hash)

我有一個數據框,其中一列是名稱。 在后面的分析階段,我需要通過此名稱列與其他數據合並,並且有一些名稱因來源而異。 我想使用名稱 - >清理名稱的哈希(map)來清理我的名字。 我發現了幾個使用R列表作為哈希的引用(例如, SE上的這個問題 ),但我無法弄清楚如何在向量中提取鍵時它們的值。 所以,例如,

> players=data.frame(names=c("Joe", "John", "Bob"), scores=c(9.8, 9.9, 8.8))
> xref = c("Bob"="Robert", "Fred Jr." = "Fred")
> players$names
[1] Joe  John Bob 
Levels: Bob Joe John

雖然players$names給出了原始幀中的名稱向量,但我需要相同的向量,只有在xref中出現的任何值都替換為它們的等效(查找)值; 我想要的結果是矢量Joe John Robert

我最接近的是:

> players$names %in% names(xref)
[1] FALSE FALSE  TRUE

這正確地表明players$names中只有“Bob”存在於xref的“鍵”(名稱)中,但我無法弄清楚如何提取該名稱的值並將其與矢量中的其他名稱相結合。根據需要不屬於xref

注意 :如果不完全清楚,我對R很新,所以如果我以錯誤的方式接近這個,我很高興得到糾正,但我的核心問題基本上就是說:我需要清理通過用已知替換替換一些傳入值並保留所有其他值, 在R中輸入一些傳入數據; 此外,原始 - >替換的地圖應存儲為數據 (如外部參照),而不是代碼。

更新的答案:ifelse

ifelse是一個更直接的解決方案,在xref是命名向量而不是列表的情況下。

players <- data.frame(names=c("Joe", "John", "Bob"), scores=c(9.8, 9.9, 8.8), stringsAsFactors = FALSE)
xref <- c("Bob" = "Robert", "Fred Jr." = "Fred")

players$clean <- ifelse(is.na(xref[players$names]), players$names, xref[players$names])

players

結果

   names scores  clean
1   Joe    9.8    Joe
2  John    9.9   John
3   Bob    8.8 Robert

以前的回答:sapply

如果xref是一個列表,則可以使用sapply函數進行條件查找

players <- data.frame(names=c("Joe", "John", "Bob"), scores=c(9.8, 9.9, 8.8))

xref <- list("Bob" = "Robert", "Fred Jr." = "Fred")

players$clean <- sapply(players$names, function(x) ifelse( x %in% names(xref), xref[x], as.vector(x)) )

players

結果

> players
  names scores  clean
1   Joe    9.8    Joe
2  John    9.9   John
3   Bob    8.8 Robert

您可以使用所需的文本替換因子級別。 這是一個循環通過xref並進行替換的示例:

for (n in names(xref)) {
  levels(players$names)[levels(players$names) == n ] <- xref[n]
}

players
##    names scores
## 1    Joe    9.8
## 2   John    9.9
## 3 Robert    8.8

替換因子水平的另一個例子。

allnames = levels(players$names)
levels(players$names)[ !is.na(xref[allnames]) ] = na.omit(xref[allnames])
players
#    names scores
# 1    Joe    9.8
# 2   John    9.9
# 3 Robert    8.8

如果你進入了非常大的數據集,你可能會看一下merge函數或data.table包。 這是一個data.table示例。

library(data.table)
players=data.table(names=c("Joe", "John", "Bob"), scores=c(9.8, 9.9, 8.8), key="names")
nms = data.table(names=names(xref),names2=xref, key="names")
out = nms[players]
out[is.na(names2),names2:=names]
out
# names names2 scores
# 1:   Bob Robert    8.8
# 2:   Joe    Joe    9.8
# 3:  John   John    9.9

這是一個與merge函數類似的例子。

players=data.frame(names=c("Joe", "John", "Bob"), scores=c(9.8, 9.9, 8.8))
nms = data.frame(names=names(xref),names2=xref,row.names=NULL)
merge(nms,players,all.y=TRUE)
# names names2 scores
# 1   Bob Robert    8.8
# 2   Joe   <NA>    9.8
# 3  John   <NA>    9.9

暫無
暫無

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

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