基于一个列匹配和复制列,而另一列进行部分匹配

时间:2019-05-02 10:06:36

标签: r dataframe match

我有两个数据帧。

数据

Name                Type            Code
gabapentine         Pharmaceutical  60142-96-3
Glyphosate          Pesticide       1071-83-6
Guanylurea          Pharmaceutical  141-83-3
hydrochlorthiazide  Pharmaceutical  58-93-5

Name                Value           Code
gabapentine         0,2             60142-96-3
Glyphosate          1,8             1071-83-6
Urea                1,2             141-83-3
hydrochlorthiazide  0,5             58-93-5

我想通过匹配列typeData,将列ValuesName添加到Code

我知道如何只匹配一列,就像这样:

Values$type = Data$type[match(Values$Name, Data$Name)]

但是现在我也要考虑Code,因为某些名称不匹配。

有没有办法像这样

Values$type = Data$type[match((Values$Name, Data$Name) | (Values$Code, Data$Code))]

这对我不起作用,所以我想知道正确的方法。

我尝试像其他问题一样使用合并

merge(Values, Data,all.x = TRUE)

但是在Guanylurea的数据帧Data中,我得到了NA类型,当它应该与数据帧Urea的{​​{1}}相匹配时。该行的结果为Values等于Type,但Pharmaceutical不完全匹配。那么如何将部分匹配项添加到函数Namesmatch中呢?还是这两个的替代品?

1 个答案:

答案 0 :(得分:0)

对此有各种各样的答案。我剩下了四个(dfrx),都使用dplyr。

library(dplyr)
df1 <- data.frame(Name = c("gabapentine", "Glyphosate",
                           "Guanylurea", "hydrochlorthiazide"),
                  Type = c("Pharmaceutical", "Pesticide", 
                           "Pharmaceutical", "Pharmaceutical"),
                  Code = c("60142-96-3", "1071-83-6",
                           "141-83-3", "58-93-5"))
df2 <- data.frame(Name = c("gabapentine", "Glyphosate",
                           "Guanylurea", "hydrochlorthiazide"),
                  Value = c(0.2, 1.8, 1.2, 0.5),
                  Code = c("60142-96-3", "1071-83-6",
                           "141-83-3", "58-93-5"))

dfr1 <- df2 %>% 
  dplyr::mutate(Type = df1$Type)
dfr2 <- df2 %>% 
  dplyr::bind_cols(Type = df1$Type)
dfr3 <- df2 %>% 
  dplyr::right_join(df1, by = "Name") %>% 
  dplyr::select(-Code.y) %>% 
  dplyr::rename("Code" = Code.x)
dfr4 <- df2 %>% 
  dplyr::right_join(df1, by = "Code") %>% 
  dplyr::select(-Name.y) %>% 
  dplyr::rename("Name" = Name.x)
> dfr4
                Name Value       Code           Type
1        gabapentine   0.2 60142-96-3 Pharmaceutical
2         Glyphosate   1.8  1071-83-6      Pesticide
3         Guanylurea   1.2   141-83-3 Pharmaceutical
4 hydrochlorthiazide   0.5    58-93-5 Pharmaceutical