如何合并数据框,其中列1是列2的子字符串

3

我有一个数据框,想要根据列df $name的值分类每一行。用于分类的是一个两列数据框tl,其中包含了tl$name和tl$type列。我想要在类似条件grepl(tl$name, df$name)下合并这两个数据框,而不是使用df$name = tl$name。

我已经尝试通过循环遍历df中的所有行,并查看其与tl是否匹配,但这似乎非常耗时。

例如:

df

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

tl

  name        type
# elephant    mammal
# gorilla     mammal
# crocodile   reptile
# shark       fish
3个回答

1
另一个想法:

library(tidyverse)

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

Which gives:

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

谢谢您的回复。如果有两个空格,比如南美蜥蜴,会在第一个空格还是第二个空格处分开名称? - AVS

0

我们可以使用sub函数通过匹配一个或多个非空白字符(\\S+)后跟一个或多个空格(\\s+)从字符串的开头(^)开始,将其替换为空白("")并与第二个数据集('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)])

谢谢。如果子字符串是字符串的开头,例如“Elephant Africa”呢? - AVS

0
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)

上述代码应该会给你想要的输出结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接