簡體   English   中英

與 R 中另一個 dataframe 中的列匹配時,替換 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.

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