[英]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
是一個更直接的解決方案,在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
如果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.