如何处理R中一列的不同项目数据?

时间:2017-02-02 14:46:21

标签: r dataframe

我试图弄清楚处理数据的最优雅方式是什么,我对同一列有不同数量的值,例如图像的标签数量不同:

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)

目标是能够找到包含标记&#34; tree&#34;的行。我的下一步是将标签strsplit()转换为单个标签,但是我不知道在哪里放置结果。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

1)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列可以是向量列表,每行一个向量这一事实。这里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)长篇另一种可能性是转换为长篇:

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