【问题标题】:Mapping multiple columns using dplyr or tidyverse in R在 R 中使用 dplyr 或 tidyverse 映射多列
【发布时间】:2020-03-02 16:37:28
【问题描述】:

我的数据与以下数据类似。注意一些我在这里没有提到的姓氏或名字

df1<-read.table(text= "id Surname Name
1234	Hamidsar	Smith
139	Sandarscom	Vicky
234	Bates	May
100	Murphu	Beki
941	Jool	Susan
469	Sali	John
990	susai	Alison",header=TRUE)

另一个数据框如下:

df2<-read.table(text= "id Surname Name
990	susai	Anis
81B	Rosak	Roy
340	Molipoor	Vicky
139	Bates	May
941	Ameri	David
990	susai	Alison
139	Bates	May
101	CICI	Beki
139	Sandarscom	Vicky
1234	Hamidsar	Smith",header=TRUE)

我想映射 id 、 surname 和 name 得到下表

id	Surname	Name	Map
1234	Hamidsar	Smith	id,Surname,Name
139	Sandarscom	Vicky	id,Surname,Name
234	Bates	May	Surname, Name
100	Murphu	Beki	Name
941	Jool	Susan	id
469	Sali	John	NA
990	susai	Alison	id,Surname,Name

有可能得到吗?我阅读了一些链接,但它们没有帮助我

【问题讨论】:

  • 你是对的,你的预期输出不是连接的结果。我现在阅读更仔细,但我根本无法理解您的预期输出。你能解释一下它的意思吗?
  • 我还是不明白。 susai Alison 在两个数据帧中都匹配 id、Surname 和 Name,那么 Surname 仅在这种情况下出现的逻辑是什么?
  • ok.. 那么 Name 不显示的逻辑是什么?
  • 否 - 990 susai Alison 出现在两个数据框中,但您只希望为该案例提供 id 和 Surname,而不是 Name。为什么?

标签: r dplyr tidyverse


【解决方案1】:
  library(tidyverse)
  library(glue)

首先,我将stringsAsFactors=FALSE 设置到您的代码中以生成数据以避免后续的痛苦。

  df1<-read.table(text= "id Surname Name
1234    Hamidsar    Smith
139 Sandarscom  Vicky
234 Bates   May
100 Murphu  Beki
941 Jool    Susan
469 Sali    John
990 susai   Alison",header=TRUE, stringsAsFactors=FALSE)

  df2<-read.table(text= "id Surname Name
990 susai   Anis
81B Rosak   Roy
340 Molipoor    Vicky
139 Bates   May
941 Ameri   David
990 susai   Alison
139 Bates   May
101 CICI    Beki
139 Sandarscom  Vicky
1234    Hamidsar    Smith",header=TRUE, stringsAsFactors=FALSE)

下面我确保 id 设置为字符类型,以便在 df2 中相同,然后我只是应用查找说“如果此值在 df2 中,则显示变量的名称,否则什么都没有”。然后我使用glue 将它们组合成一个Map 变量。

  df1 %>% 
    mutate(id = as.character(id),
           Map_id = if_else(id %in% df2$id, "id", NA_character_),
           Map_Surname = if_else(Surname %in% df2$Surname, "Surname", NA_character_),
           Map_Name = if_else(Name %in% df2$Name, "Name", NA_character_),
           Map = glue("{Map_id} {Map_Surname} {Map_Name}", .na = "") %>% 
             str_trim() %>% 
             str_replace_all(" ", ", ")) %>% 
    select(id, Surname, Name, Map)

#>     id    Surname   Name               Map
#> 1 1234   Hamidsar  Smith id, Surname, Name
#> 2  139 Sandarscom  Vicky id, Surname, Name
#> 3  234      Bates    May     Surname, Name
#> 4  100     Murphu   Beki              Name
#> 5  941       Jool  Susan                id
#> 6  469       Sali   John                  
#> 7  990      susai Alison id, Surname, Name

【讨论】:

  • 谢谢你,菲尔。
猜你喜欢
  • 1970-01-01
  • 2021-04-19
  • 2020-09-20
  • 2012-07-01
  • 2021-05-30
  • 2018-10-22
  • 2020-07-06
  • 1970-01-01
  • 2016-03-26
相关资源
最近更新 更多