2017-06-04 50 views
0

我有一个表user_aisles其是含有由user_iduser_aislesn是通过在过道用户购买的物品的数目分组的数据帧。变换各USER_ID组特征向量

kable(head(summarize(user_aisles, n=n()) , 9)) 

| user_id| aisle_id| n| 
|-------:|--------:|--:| 
|  1|  2| 8| 
|  1|  3| 12| 
|  1|  4| 5| 
|  2|  1| 1| 
|  2|  3| 6| 
|  2|  14| 1| 
|  2|  17| 2| 
|  2|  20| 1| 
|  2|  21| 5| 

我想转换成特征向量这对于每个用户ID。这样的特征向量应该是尺寸为nrow(aisles)

所以每个user_id都得到一个对应的特征向量。用户1的特征向量可以(基于数据)看起来像

1: [0, 8, 12, 5, 0, .., 0] 

我该怎么做?

回答

0
groups <- split(df, df$user_id) 
lapply(groups, function(x) rep(x$aisle_id, x$n)) 

您可以使用split,以便将用户,然后rep功能扩展过道IDS。

+0

嗯。不,这不是我需要的。 'x $ aisle_id'应该是每个特征向量中的_index_。我不确定你为什么重复这个价值? – displayname

0

假设你有一个叫做数据帧数据data可以使用tidyrcomplete功能:

library(tidyverse)  
data %>% complete(user_id, aisle_id = 1:21, fill = list(n = 0)) 

# A tibble: 42 × 3 
    user_id aisle_id  n 
    <dbl> <dbl> <dbl> 
1  1  1  0 
2  1  2  8 
3  1  3 12 
4  1  4  5 
5  1  5  0 
6  1  6  0 
7  1  7  0 
8  1  8  0 
9  1  9  0 
10  1  10  0 
# ... with 32 more rows 

在这里,我假设有根据数据中的最大值21点可能过道的ID。

如果你想为每个消费者一排,你可以使用spread

data %>% 
complete(user_id, aisle_id = 1:21, fill = list(n = 0)) %>% 
mutate(aisle_id = paste0("aisle_", formatC(aisle_id, width = 2, flag = 0))) %>% spread(aisle_id, n) 

    # A tibble: 2 × 22 
    user_id aisle_01 aisle_02 aisle_03 aisle_04 aisle_05 aisle_06 aisle_07 aisle_08 aisle_09 aisle_10 aisle_11 aisle_12 
* <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1  1  0  8  12  5  0  0  0  0  0  0  0  0 
2  2  1  0  6  0  0  0  0  0  0  0  0  0 
# ... with 9 more variables: aisle_13 <dbl>, aisle_14 <dbl>, aisle_15 <dbl>, aisle_16 <dbl>, aisle_17 <dbl>, aisle_18 <dbl>, 
# aisle_19 <dbl>, aisle_20 <dbl>, aisle_21 <dbl>