Сопоставить и скопировать столбец на основе одного столбца и частичное совпадение другого столбца - PullRequest
0 голосов
/ 02 мая 2019

У меня есть два кадра данных.

ДАННЫЕ

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 из фрейма данных Values.Результат для этой строки будет Type равен Pharmaceutical, но Names точно не совпадает.Так как же я могу добавить частичное совпадение в функции match или merge?Или есть альтернатива этим двум?

1 Ответ

0 голосов
/ 16 мая 2019

Существует широкий спектр ответов на этот вопрос.Я оставил четыре (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...