Как объединить фреймы данных, где column1 является подстрокой column2

У меня есть фрейм данных, и я хотел бы классифицировать каждую строку на основе значения столбца df $ name. Для классификации у меня есть фрейм данных с двумя столбцами tl с столбцом tl $ name и tl $ type. Я хотел бы объединить два фрейма данных с одинаковым условием grepl (tl $ name, df $ name) вместо df $ name = tl $ name.

Я уже пытался перебрать все строки в df и посмотреть, где есть совпадение с tl, но это кажется очень трудоемким.

Например:

Д.Ф.

  name        
# African elephant    
# Indian elephant    
# Silverback gorilla     
# Nile crocodile   
# White shark       

Т.Л.

  name        type
# elephant    mammal
# gorilla     mammal
# crocodile   reptile
# shark       fish

3 ответа

Решение

Мы можем удалить подстроку с sub сопоставляя одно или несколько не белых пробелов (\\S+) с последующим одним или несколькими пробелами (\\s+) с самого начала (^) строки, замените ее пробелом ("") а также merge со вторым набором данных ('tl')

merge(transform(df, name = sub("^\\S+\\s+", "", name)), tl)
#      name    type
#1 crocodile reptile
#2  elephant  mammal
#3  elephant  mammal
#4   gorilla  mammal
#5     shark    fish

Если нам нужно обновить первый набор данных,

df$type <- with(df, tl$type[match(sub("^\\S+\\s+", "", name), tl$name)])

Еще одна идея:

library(tidyverse)

df %>%
  separate(name, into = c("t", "name")) %>%
  left_join(tl)

Который дает:

#           t      name    type
#1    African  elephant  mammal
#2     Indian  elephant  mammal
#3 Silverback   gorilla  mammal
#4       Nile crocodile reptile
#5      White     shark    fish
df

  name        
# African elephant    
# Indian elephant    
# Silverback gorilla     
# Nile crocodile   
# White shark       
tl

  name        type
# elephant    mammal
# gorilla     mammal
# crocodile   reptile
# shark       fish

Я думаю, что это то, что вы хотите сделать

df<-csplit(df, splitcols="name", sep=" ")

Приведенная выше команда разделит этот столбец на два столбца с именами столбцов name.1 и name.2.

colnames(df)<-c("name","type")

Приведенная выше команда даст правильные имена столбцов для объединения

df_tl<-merge(x=df, y=tl, by="type",all=True)

Приведенный выше код должен дать вам желаемый результат.

Другие вопросы по тегам