我最初使用的是 dplyr::left_join(),但它沒有我想要的 match = "first" 引數在 plyr::join 中可用。現在的問題是我剩余的代碼有 .x 和 .y 用于重復變數,所以我不能只使用 janitor::clean_names()。
為了讓您了解我在說什么:
id <- c(1, 2, 3, 4, 5)
name1 <- c("a", "b", "c", "d", "e")
name2 <- c("k", "l", "m", "n", "o")
name3 <- c("u", "v", "w", "x", "y")
name4 <- c("z", "a", "b", "c", "d")
df <- data.frame(id, name1, name2, name3, name4)
id <- c(1, 2, 3, 4, 5)
name1 <- c("f", "i", "j", "k", "l")
name2 <- c("p", "q", "r", "s", "t")
name3 <- c("z", "a", "b", "c", "d")
name5 <- c("z", "a", "b", "c", "d")
df2 <- data.frame(id, name1, name2, name3, name5)
library(plyr)
df_join <- plyr::join(df, df2, by=c("id"), type="left", match="first")
我想將重復的變數(name1、name2、name3)變成以下內容:
右側:name1.x、name2.x、name3.x 左側:name1.y、name2.y、name3.y
我該怎么做呢?janitor::clean_names() 似乎只為左側變數添加“_2”。
uj5u.com熱心網友回復:
您仍然可以使用dplyr::left_join. 要模仿 的行為plyr::join,只需將id右側資料NA框中的重復s 轉換為s 或在id左側資料框的列中找不到的任何其他值。例如,
library(dplyr)
df2 %>%
mutate(id = replace(id, duplicated(id), NA_integer_)) %>%
left_join(df, ., by = "id", suffix = c(".y", ".x"))
輸出
id name1.y name2.y name3.y name4 name1.x name2.x name3.x name5
1 1 a k u z f p z z
2 2 b l v a i q a a
3 3 c m w b j r b b
4 4 d n x c k s c c
5 5 e o y d l t d d
這兩個資料框是
> df
id name1 name2 name3 name4
1 1 a k u z
2 2 b l v a
3 3 c m w b
4 4 d n x c
5 5 e o y d
> df2
id name1 name2 name3 name5
1 1 f p z z
2 2 i q a a
3 3 j r b b
4 4 k s c c
5 5 l t d d
6 1 XXX XXX XXX XXX
這個應該適用于您想要加入的任意數量的列(只要您指定它們)。
libaray(dplyr)
by <- c("id1", "id2")
df2 %>% # v-v------------------- Not a typo. You need two commas here.
mutate(across(!!by) %>% `[<-`(duplicated(.), , value = NA)) %>%
left_join(df, ., by = by, suffix = c(".y", ".x"))
兩個資料框
> df
id1 id2 name1 name2 name3 name4
1 1 5 a k u z
2 2 4 b l v a
3 3 3 c m w b
4 4 2 d n x c
5 5 1 e o y d
> df2
id1 id2 name1 name2 name3 name5
1 1 5 f p z z
2 2 4 i q a a
3 3 3 j r b b
4 4 2 k s c c
5 5 1 l t d d
6 3 3 XXX XXX XXX XXX
輸出
id1 id2 name1.y name2.y name3.y name4 name1.x name2.x name3.x name5
1 1 5 a k u z f p z z
2 2 4 b l v a i q a a
3 3 3 c m w b j r b b
4 4 2 d n x c k s c c
5 5 1 e o y d l t d d
uj5u.com熱心網友回復:
library(dplyr)
id <- c(1, 2, 3, 4, 5)
name1 <- c("a", "b", "c", "d", "e")
name2 <- c("k", "l", "m", "n", "o")
name3 <- c("u", "v", "w", "x", "y")
name4 <- c("z", "a", "b", "c", "d")
df <- data.frame(id, name1, name2, name3, name4)
id <- c(1, 1, 3, 3, 5)
name1 <- c("f", "i", "j", "k", "l")
name2 <- c("p", "q", "r", "s", "t")
name3 <- c("z", "a", "b", "c", "d")
name5 <- c("z", "a", "b", "c", "d")
df2 <- data.frame(id, name1, name2, name3, name5)
#not desired result
df %>% left_join(df2, by = 'id')
#> id name1.x name2.x name3.x name4 name1.y name2.y name3.y name5
#> 1 1 a k u z f p z z
#> 2 1 a k u z i q a a
#> 3 2 b l v a <NA> <NA> <NA> <NA>
#> 4 3 c m w b j r b b
#> 5 3 c m w b k s c c
#> 6 4 d n x c <NA> <NA> <NA> <NA>
#> 7 5 e o y d l t d d
df_join <- plyr::join(df, df2, by=c("id"), type="left", match="first")
df_join
#> id name1 name2 name3 name4 name1 name2 name3 name5
#> 1 1 a k u z f p z z
#> 2 2 b l v a <NA> <NA> <NA> <NA>
#> 3 3 c m w b j r b b
#> 4 4 d n x c <NA> <NA> <NA> <NA>
#> 5 5 e o y d l t d d
df %>% left_join(df2, by = 'id') %>% group_by(id) %>% slice_head() %>% as.data.frame()
#> id name1.x name2.x name3.x name4 name1.y name2.y name3.y name5
#> 1 1 a k u z f p z z
#> 2 2 b l v a <NA> <NA> <NA> <NA>
#> 3 3 c m w b j r b b
#> 4 4 d n x c <NA> <NA> <NA> <NA>
#> 5 5 e o y d l t d d
由reprex 包于 2022-01-11 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/409233.html
標籤:
上一篇:從兩個表的同名兩個列中獲取資料
下一篇:NGINX404未找到但檔案存在
