![](/img/trans.png)
[英]R: Identify non-NA values from one column and create dataframe with values from another column based rows selected
[英]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_join
和inner_join
的解決方案
library(dplyr)
df1 %>%
full_join(df2) %>% na.omit() %>%
full_join(df1 %>% inner_join(df2)) %>%
filter(Number %in% df1$Number) %>%
arrange(Number)
#> 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.