說我有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
如何以有效的方式做到這一點?
說我有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
如何以有效的方式做到這一點?
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
+1正在處理組合'sapply'和'apply'調用,但是你的更好。可以通過'unique(unlist(strsplit(dat $ y,「)))獲得字符列表' –
確實有幫助。 –
的嘗試,轉換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
快速和骯髒的
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
不是。它不是dataframe。如果你使用'as.data.frame',你會得到一個錯誤。 –
@Dwin,謝謝。編輯&校正 –
如果你有data.frame你應該張貼'dput(頭(DFRM)) '。 –
我已經發布了dput(head(df))作爲你的方向。 @DWin –
您需要做的第一件事是將該因子列轉換爲像字符向量那樣明智的東西。 –