Как объединить фреймы данных, где 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)
Приведенный выше код должен дать вам желаемый результат.