Список векторов и заполнение последовательности - PullRequest
0 голосов
/ 28 мая 2018

У меня есть фрейм данных с тремя столбцами

SentenceID = c(1,1,1,1,2,2,2,3,3,3,3,3,3,3,3)
Tokens = c("I","went","to","school","nobody","can","find","some","people","know","what","they","are","doing","now")
WordIndex = c(3,4,7,8,9,10,12,54,34,66,33,89,87,23,22)

df = data.frame(SentenceID, Tokens, WordIndex)

Желаемый результат:

Мне нужно пройтись по каждому SentenceID и создать список векторов X, как показано ниже

X           
[[1]]   3 4 7 8     
[[2]]   9 10 12     
[[3]]   54 34 66 33 89 87 23 22 

Тогда мне нужно дополнить их нулями на 10 спотов

X           
[[1]]   3 4 7 8 0 0 0 0 0 0 0       
[[2]]   9 10 12 0 0 0 0 0 0 0   
[[3]]   54 34 66 33 89 87 23 22 0 0 

Как мне этого добиться, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Вы можете попробовать tidyverse, используя функцию purrr map

library(tidyverse)
df %>% 
  split(.$SentenceID) %>% 
  map(~.x$WordIndex %>% c(rep(0, 10-length(.))) %>% head(10))
$`1`
 [1] 3 4 7 8 0 0 0 0 0 0

$`2`
 [1]  9 10 12  0  0  0  0  0  0  0

$`3`
 [1] 54 34 66 33 89 87 23 22  0  0
0 голосов
/ 28 мая 2018

Базовое решение R с aggregate:

lapply(aggregate(WordIndex, list(SentenceID), c)$x, 
    function(X) head(c(X, rep(0,10)), 10))
$`1`
 [1] 3 4 7 8 0 0 0 0 0 0
$`2`
 [1]  9 10 12  0  0  0  0  0  0  0
$`3`
 [1] 54 34 66 33 89 87 23 22  0  0
0 голосов
/ 28 мая 2018

вот один из способов сделать это:

> lapply(split(df$WordIndex, df$SentenceID), function(x) c(x, rep(0, pmax(10 - length(x), 0))))
$`1`
 [1] 3 4 7 8 0 0 0 0 0 0

$`2`
 [1]  9 10 12  0  0  0  0  0  0  0

$`3`
 [1] 54 34 66 33 89 87 23 22  0  0
...