我有两个数据帧。
数据
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
我想通过匹配列type
和Data
,将列Values
从Name
添加到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
不完全匹配。那么如何将部分匹配项添加到函数Names
或match
中呢?还是这两个的替代品?
答案 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