2015-08-08 132 views
2

ca.df模式匹配ř

id Category 
1  Noun 
2  Negative 
3  Positive 
4  adj 
5  word 

每个术语被分配到1个多类别,因此,它对应于超过1点的id。在terms.df中,所有的id都在一列中。

terms.df

Terms id 
Love 1 4 5 3 
Hate 2 4 5 
ice  1 5 

而言ID是对应在ca.df.类别我想这样的输出:

x.df

Category  terms 

Noun   ice Love 
Negative  Hate 
Positive  Love 
adj   Hate Love 
word   ice Hate Love 

如何做到这一点?

+0

在'terms.df'中,不应该''爱''是'3 4 5'而不是'1 4 5'的id? – werkritter

+0

应该是1 4 5,谢谢! – Lucia

+0

那么为什么在'x.df'中'Positive'类别可以获得任何名词,因为'terms.df'中没有'3'? – werkritter

回答

5

这里是一个可能的data.table/splitstackshape封装解决方案

library(splitstackshape) ## loads `data.table` package too 
terms.df <- cSplit(terms.df, "id", sep = " ", direction = "long") 
setkey(terms.df, id)[ca.df, .(Category , Terms = toString(Terms)), by = .EACHI] 

# id Category   Terms 
# 1: 1  Noun  Love, ice 
# 2: 2 Negative   Hate 
# 3: 3 Positive   Love 
# 4: 4  adj  Love, Hate 
# 5: 5  word Love, Hate, ice 

几点说明

  1. 我们首先用空格根据Terms
  2. 然后,我们执行的是二进制留在id列加入两个数据集之间分裂id
  3. 在加入时,我们根据每个使用by = .EACHI运算符的运算符连接了Terms列让我们执行不同的操作,同时joinig
1

您可以使用merge结合基于ID

ca.df <- data.frame(id=1:5, Category=c("Noun", "Negative", "Positive", "adj", "word")) 
terms.df <- data.frame(Terms=c(rep("Love", 3), rep("Hate", 3), rep("ice", 2)), 
     id = c(1,4,5,2,4,5,1,5)) 
x.df <- merge(ca.df, terms.df, by="id") 
x.df 

    id Category Terms 
1 1  Noun Love 
2 1  Noun ice 
3 2 Negative Hate 
4 4  adj Love 
5 4  adj Hate 
6 5  word Love 
7 5  word Hate 
8 5  word ice 
+0

你好,谢谢你的回答,但你的terms.df看起来不像我的。 – Lucia

+0

@Lucia,这是因为'x.df'与'terms.df'不一致(请参阅我对该问题的评论)。由于它看起来似乎不清楚应该如何创建'x.df'文件,您是否可以用你想要做什么的描述来更新问题(而不是象以前那样只显示输入和输出)? – werkritter

+0

。,谢谢你的回复,我更新了这篇文章。请注意,“在terms.df所有id都在一列” – Lucia

2

使用tidyrdplyr一个解决方案。

library(tidyr) 
library(dplyr) 
ca.df$id <- as.character(ca.df$id) 

terms.df %>% separate(id,into=paste0("V",1:3),sep = " ",extra = "merge") %>% 
    gather(var,id,-Terms) %>% 
    filter(!is.na(id)) %>% 
    left_join(ca.df,by="id") %>% 
    select(-var,-id) %>% 
    group_by(Category) %>% 
    summarize(Terms=paste(Terms,collapse=" ")) 

输出:

Source: local data frame [4 x 2] 

     Category   Terms 
    1 Negative   Hate 
    2  Noun  Love ice 
    3  adj  Love Hate 
    4  word ice Love Hate 

数据:

ca.df <- read.table(text = 
"id Category 
1  Noun 
2  Negative 
3  Positive 
4  adj 
5  word",head=TRUE,stringsAsFactors=FALSE) 

terms.df <- read.table(text = 
"Terms id 
Love '1 4 5' 
Hate '2 4 5' 
ice  '1 5' 
",head=TRUE,stringsAsFactors=FALSE) 
+0

hmmm,这不适用于我的数据。 – Lucia