2017-05-07 14 views
2

我有一个数据框,并希望根据列df $ name的值对每行进行分类。对于分类,我有一个两列数据框t1,列tl $ name和tl $ type。我想合并两个数据框,类似条件grepl(tl $ name,df $ name),而不是df $ name = tl $ name。如何合并其中column1是第2列的子字符串的数据帧

我已经尝试了循环播放df中的所有行并查看与tl匹配的位置,但这看起来非常耗时。

例如:

DF

TL

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

回答

0

我们可以通过匹配接着是一个或多个的一个或多个非空白(\\S+)与sub取出子(\\s+)从字符串的开头(^)替换为空白("")a第二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)]) 
+0

谢谢。如果子字符串是字符串的开头,例如大象非洲? – AVS

1

另一个想法:

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

谢谢你的回复。如果有两个空格会发生什么,例如南美蜥蜴?这个名字会在第一或第二空间分开吗? – 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) 

上面的代码应该给你所需的输出。

相关问题