簡體   English   中英

R 用單獨的列中的非 NA 值覆蓋列值 dataframe

[英]R Overwrite column values with non NA values from column in separate dataframe

我有一個 dataframe 'df1' 有很多列,但感興趣的是:

數字 代碼
1個
2個
3個
10
11 AMRO
4個
277
2100 BLPH

我還有另一個 dataframe 'df2' 有很多列,但感興趣的是:

數字 代碼
1個 AMCR
2個 AMCR
3個 巴諾
10 BAEA
12 AMRO
4個 北美
277 北美
2100 北美

我希望“df1”和“df2”的“數字”列中的匹配值導致“df2”中“代碼”列中的值覆蓋“df1”中的“代碼”值,只要“代碼” 'df2' 中的值不包含 NA,因此 'df1' 的最終結果如下所示:

數字 代碼
1個 AMCR
2個 AMCR
3個 巴諾
10 BAEA
11 AMRO
4個
277
2100 BLPH

謝謝您的幫助!

我們可以做的

library(powerjoin)
power_left_join(df1, df2, by = "Number", conflict = coalesce)

-輸出

Number Code
1      1 AMCR
2      2 AMCR
3      3 BANO
4     10 BAEA
5     11 AMRO
6      4 <NA>
7    277 <NA>
8   2100 BLPH

或者進行覆蓋,使用data.table

library(data.table)
setDT(df1)[df2, Code := fcoalesce(Code, i.Code), on = .(Number)]

-輸出

> df1
   Number   Code
    <int> <char>
1:      1   AMCR
2:      2   AMCR
3:      3   BANO
4:     10   BAEA
5:     11   AMRO
6:      4   <NA>
7:    277   <NA>
8:   2100   BLPH

數據

df1 <- structure(list(Number = c(1L, 2L, 3L, 10L, 11L, 4L, 277L, 2100L
), Code = c(NA, NA, NA, NA, "AMRO", NA, NA, "BLPH")), 
class = "data.frame", row.names = c(NA, 
-8L))

df2 <- structure(list(Number = c(1L, 2L, 3L, 10L, 12L, 4L, 277L, 2100L
), Code = c("AMCR", "AMCR", "BANO", "BAEA", "AMRO", NA, NA, NA
)), class = "data.frame", row.names = c(NA, -8L))

這是使用bind_cols的替代方法:

library(dplyr)

bind_cols(df1, df2) %>% 
  mutate(Code = coalesce(Code...2, Code...4)) %>% 
  select(Number = Number...1, Code)

 Number Code
1      1 AMCR
2      2 AMCR
3      3 BANO
4     10 BAEA
5     11 AMRO
6      4 <NA>
7    277 <NA>
8   2100 BLPH

這是一個使用dplyr full_joininner_join的解決方案

library(dplyr)
df1 %>% 
  full_join(df2) %>% na.omit() %>% 
  full_join(df1 %>% inner_join(df2)) %>% 
  filter(Number %in% df1$Number) %>%
  arrange(Number)

Output


#>   Number Code
#> 1      1 AMCR
#> 2      2 AMCR
#> 3      3 BANO
#> 4      4 <NA>
#> 5     10 BAEA
#> 6     11 AMRO
#> 7    277 <NA>
#> 8   2100 BLPH

暫無
暫無

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

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