2017-05-07 6 views
2

私はデータフレームを持ち、列df $ nameの値に基づいて各行を分類したいと考えています。分類のために、私は列tl $ nameとtl $ typeを持つ2列のデータフレームtlを持っています。私はdf $ name = tl $ nameの代わりにgrepl(tl $ name、df $ name)のような条件で2つのデータフレームをマージしたいと思います。column1がcolumn2の部分文字列であるデータフレームをマージする方法

私はすでにdfのすべての行をループし、tlと一致する箇所を見てみましたが、これは非常に時間がかかるようです。

例:

DF

我々は、1つ以上の続く一つまたは複数の非空白(\\S+)を一致させることによってsubでサブストリングを削除することができ

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

答えて

0

TL空白(\\s+)を文字列の先頭(^)から空白("")に置き換えます。 ND第二のデータセット( '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 

merge、我々は最初のデータセットを更新する必要がある場合は、

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

お返事ありがとうございます。 2つのスペースがある場合はどうなりますか?南アメリカのトカゲ?最初のスペースか2番目のスペースで名前が分かれますか? – 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 

私は、これはあなたが上記のコマンドはname.1とname.2列名を持つ2つの列に、その列を分割します

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

何をしたいのかと思います。

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

上記のコマンドはあなたに所望の出力を与えるべきである

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

上記のコードをマージするための適切なカラム名を与えます。

関連する問題