2013-06-04 35 views
9

Tôi có một khung dữ liệu dưới dạng cột - đầu vàoChuyển đổi câu để từ trong R

Id Comment 
xc545 Ronald is a great person 
g6548 Hero worship is bad 

tôi cần đầu ra theo hình thức quả

Id Words 
xc545 Ronald 
xc545 is 
xc545 a 
xc545 great 
xc545 person 
g6548 Hero 
g6548 worship 
g6548 is 
g6548 bad 

Cần một tuyên bố R để thực hiện điều này.

Sau đây là những gì tôi đã cố gắng -

result<-lapply(input,function(x)strsplit(x[2]," ")) 

Tuy nhiên điều này sẽ chỉ trả lại một bản ghi.

+1

Tôi có thể hỏi lý do tại sao bạn muốn điều này? Điều đó có thể xác định liệu một khung dữ liệu có phải là cấu trúc tốt nhất cho dữ liệu của bạn hay không. –

+0

Tôi muốn tìm kiếm trên câu cho tên sản phẩm và gắn thẻ chúng. Tôi có tên sản phẩm (200.000) trong một cột bảng khác. So sánh SQL mất nhiều thời gian. – user1882633

Trả lời

8

Giả sử DF là data.frame của bạn, một khả năng có thể là:

> List <- strsplit(DF$Comment, " ") 
> data.frame(Id=rep(DF$Id, sapply(List, length)), Words=unlist(List)) 
    Id Words 
1 xc545 Ronald 
2 xc545  is 
3 xc545  a 
4 xc545 great 
5 xc545 person 
6 g6548 Hero 
7 g6548 worship 
8 g6548  is 
9 g6548  bad 

Lưu ý rằng câu trả lời của tôi là chỉ có giá trị khi có một không gian đơn giản giữa mỗi cặp từ.

+1

Cảm ơn rất nhiều - Điều này thực sự hữu ích! – user1882633

3

Một giải pháp data.table lấy cảm hứng từ this một:

library(data.table) 
dt = data.table(df) 
dt[,c(Words=strsplit(Comment, " ", fixed = TRUE)), by = Id] 
Id  V1 
1: xc545 Ronald 
2: xc545  is 
3: xc545  a 
4: xc545 great 
5: xc545 person 
6: g6548 Hero 
7: g6548 worship 
8: g6548  is 
9: g6548  bad 
3

Sử dụng scan, tapplystack:

d <- read.table(text='Id Comment 
xc545 "Ronald is a great person" 
g6548 "Hero worship is bad"', header=TRUE, as.is=TRUE) 

stack(tapply(d$Comment, d$Id, function(x) scan(text=x, what=''))) 
# values ind 
# 1 Hero g6548 
# 2 worship g6548 
# 3  is g6548 
# 4  bad g6548 
# 5 Ronald xc545 
# 6  is xc545 
# 7  a xc545 
# 8 great xc545 
# 9 person xc545 
Các vấn đề liên quan