[英]R - Add a new column to a dataframe using matching values of another dataframe
[英]Replace values in column of a dataframe when matching to column in another dataframe in R
我只是閱讀了類似的問題,但沒有找到回答我的具體問題。 我有兩個數據框,
df1 <- data.frame("name" = c("11-24", "Tim", "Anna", "67-14", "A0839", "A4b", "Lisa", "Selina"))
df2 <- data.frame("abbreviation" = c("11-24", "67-14", "A0839", "A4b"),
"name" = c("Charles", "Nick", "Harry", "Lola"))
看起來像這樣:
> df1
name
1 11-24
2 Tim
3 Anna
4 67-14
5 A0839
6 A4b
7 Lisa
8 Selina
> df2
abbreviation name
1 11-24 Charles
2 67-14 Nick
3 A0839 Harry
4 A4b Lola
我想用 df2 中的匹配名稱替換在 df1 的“名稱”列中找到的縮寫。 因此 11-24 被 Charles 替換,或者 A4b 被 Lola 替換。
我嘗試的是:
df1 <- df1 %>%
mutate(name = ifelse(name %in% df2$abbreviation, df2$name, name))
但這並沒有給出我想要的結果。 我想:
> df1
name
1Charles
2 Tim
3 Anna
4 Nick
5 Harry
6 Lola
7 Lisa
8 Selina
我的數據框有不同的長度。 我正在尋找一個 tidyverse 解決方案,也許你們中的一個人有什么想法..
這對我有很大幫助:) 最好的,凱瑟琳
使用 join 和coalesce
。
library(dplyr)
df1 %>%
left_join(df2, by = c('name' = 'abbreviation')) %>%
transmute(name = coalesce(name.y, name))
# name
#1 Charles
#2 Tim
#3 Anna
#4 Nick
#5 Harry
#6 Lola
#7 Lisa
#8 Selina
在base中,您可以使用match
使此更新加入。
idx <- match(df1$name, df2$abbreviation)
idxn <- which(!is.na(idx))
#idxn <- !is.na(idx) #Alternative
df1$name[idxn] <- df2$name[idx[idxn]]
df1
# name
#1 Charles
#2 Tim
#3 Anna
#4 Nick
#5 Harry
#6 Lola
#7 Lisa
#8 Selina
基礎 R 解決方案:
idx <- match(df1$name, df2$abbreviation)
transform(df1, name = ifelse(!is.na(idx), df2$name[idx], name))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.