2013-01-24 29 views
1

说我有R中的数据帧:data.frame(x=1:4, y=c("a b c", "b", "a c", "c"))如何从R中的数据框构建倒排索引?

x  y 
1 1 a b c 
2 2  b 
3 3 a c 
4 4  c 

现在我想建立一个新的数据帧,这是在IR或推荐系统很常见的倒排索引,从中:

y x 
a 1 3 
b 1 2 
c 1 3 4 

如何以有效的方式做到这一点?

+0

如果你有data.frame你应该张贴'dput(头(DFRM)) '。 –

+0

我已经发布了dput(head(df))作为你的方向。 @DWin –

+0

您需要做的第一件事是将该因子列转换为像字符向量那样明智的东西。 –

回答

1
conv <- function(x) { 
    l <- function(z) { 
    paste(x$x[grep(z, x$y)], collapse=' ') 
    } 
    lv <- Vectorize(l) 

    alphabet <- unique(unlist(strsplit(as.character(x$y), ' '))) # hard-coding this might be preferred for some uses. 
    y <- lv(alphabet) 
    data.frame(y=names(y), x=y) 
} 

x <- data.frame(x=1:4, y=c("a b c", "b", "a c", "c")) 
> conv(x) 
## y  x 
## a a 1 3 
## b b 1 2 
## c c 1 3 4 
+0

+1正在处理组合'sapply'和'apply'调用,但是你的更好。可以通过'unique(unlist(strsplit(dat $ y,“)))获得字符列表' –

+0

确实有帮助。 –

0

的尝试,转换y字符后:

test <- data.frame(x=1:4,y=c("a b c","b","a c","c"),stringsAsFactors=FALSE) 

result <- strsplit(test$y," ") 
result2 <- sapply(unique(unlist(result)),function(y) sapply(result,function(x) y %in% x)) 
result3 <- apply(result2,2,function(x) test$x[which(x)]) 
final <- data.frame(x=names(result3),y=sapply(result3,paste,collapse=" ")) 

> final 
    x  y 
a a 1 3 
b b 1 2 
c c 1 3 4 
0

快速和肮脏的

original.df <- data.frame(x=1:4, y=c("a b c", "b", "a c", "c")) 

    original.df$y <- as.character(original.df$y) 

    y.split <- strsplit(original.df$y, " ") 

    y.unlisted <- unique(unlist(y.split)) 

    new.df <- 
    sapply(y.unlisted, function(element) 
     paste(which(sapply(y.split, function(y.row) element %in% y.row)), collapse=" ")) 

    as.data.frame(new.df) 

    > new.df 
    a 1 3 
    b 1 2 
    c 1 3 4 
+0

不是。它不是dataframe。如果你使用'as.data.frame',你会得到一个错误。 –

+0

@Dwin,谢谢。编辑&校正 –