我试图弄清楚处理数据的最优雅方式是什么,我对同一列有不同数量的值,例如图像的标签数量不同:
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()转换为单个标签,但是我不知道在哪里放置结果。
有什么建议吗?
答案 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