2017-02-02 3 views
1

私は同じ列の値の様々な数を持っているデータを処理する最もエレガントな方法であるかを把握しようとしている、画像のタグの例については、異なる数:Rの1つの列に対して項目数が異なるデータを扱うにはどうすればよいですか?

image.id <- c("img1", "img2", "img3") 
image.tags <- c("house#garden#sky#tree", "house#garden#lake", "house#tree") 
image.data <- data.frame(image.id, image.tags) 

目標がありますたとえば、タグ「ツリー」を含む行を見つけることができます。私の次のステップは、タグを単一のタグにstrsplit()することですが、結果をどこに置くのかは分かりません。

提案がありますか?

答えて

3

1)私達はちょうど木をgrepすることができをgrepl:もう一つの可能​​性についてネスト)

subset(image.data, grepl("tree", image.tags)) 
## image.id   image.tags 
## 1  img1 house#garden#sky#tree 
## 3  img3   house#tree 

2 data.frame列はベクトルのリストすることができるという事実で、それをベースにすることです各行に対して1つのベクトル。ここでDFなdata.frameであり、我々は、そのような各ベクトルに"tree"を探すことができます。

DF <- transform(image.data, image.tags = strsplit(as.character(image.tags), "#")) 
subset(DF, sapply(image.tags, function(x) "tree" %in% x)) 
##  image.id    image.tags 
## 1  img1 house, garden, sky, tree 
## 3  img3    house, tree 

3)長い形式さらに別のpossiblityは長い形式に変換することです:

library(dplyr) 
library(tidyr) 

image.data %>% 
    separate_rows(image.tags) %>% # long form 
    filter(image.tags == "tree") 
## image.id image.tags 
## 1  img1  tree 
## 2  img3  tree 

かおそらく、ツリーを含むグループのすべての行をリストすることです:

image.data %>% 
    separate_rows(image.tags) %>% # long form 
    right_join(filter(., image.tags == "tree"), by = "image.id") %>% 
    select(image.id, image.tags = image.tags.x) 
## image.id image.tags 
## 1  img1  house 
## 2  img1  garden 
## 3  img1  sky 
## 4  img1  tree 
## 5  img3  house 
## 6  img3  tree 
+0

私は 'image.data%>%separate_rows(image.tag私が必要とするものですが、自分のデータで動作させることができません。エラーは発生しませんが、データフレームに変更はありません。 '%>%'なしでこれを行う方法の提案はありますか? –

+0

最新バージョンのパッケージを使用していることを確認してください。問題が解決しない場合は、実行しているデータに投稿されたデータとの差異が生じることがあります。 –

関連する問題