2015-08-08 24 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