Добавить список к каждой строке в кадре данных - PullRequest
0 голосов
/ 31 августа 2018

Я хотел бы добавить список в каждую строку кадра данных.

# DATA
> df <- tibble(ID = 1:6, x = letters[1:6])

# A tibble: 6 x 2
     ID x    
  <int> <chr>
1     1 a    
2     2 b    
3     3 c    
4     4 d    
5     5 e    
6     6 f    

Легко добавить одно значение.

df$new.col <- "boo"

# A tibble: 6 x 3
     ID x     new.col
  <int> <chr> <chr>  
1     1 a     boo    
2     2 b     boo    
3     3 c     boo    
4     4 d     boo    
5     5 e     boo    
6     6 f     boo    

Добавление более одного значения не так просто.

Вместо добавления списка в каждую строку (как указано выше) содержимое списка применяется ко всему столбцу. Это не очень интуитивно понятно:

df$my.lists <- list("boo", "bah")
df %>% unnest()
# A tibble: 6 x 3
     ID x     my.lists
  <int> <chr> <chr>   
1     1 a     boo     
2     2 b     bah     
3     3 c     boo     
4     4 d     bah     
5     5 e     boo     
6     6 f     bah   

... и ни то, ни другое ...

df$my.lists <- c("boo", "bah")
df %>% unnest()
# A tibble: 6 x 3
     ID x     my.lists
  <int> <chr> <chr>   
1     1 a     boo     
2     2 b     bah     
3     3 c     boo     
4     4 d     bah     
5     5 e     boo     
6     6 f     bah  

мой желаемый результат будет иметь список в каждой строке, как показано ниже:

# A tibble: 6 x 3
     ID x     my.lists
  <int> <chr> <chr>   
1     1 a     <list [2]>    
2     2 b     <list [2]>
3     3 c     <list [2]>
4     4 d     <list [2]>
5     5 e     <list [2]>
6     6 f     <list [2]>

1 Ответ

0 голосов
/ 31 августа 2018

Это довольно распространенная проблема, с которой, вероятно, сталкиваются все tidyverse пользователи в то или иное время (например, этот вопрос я опубликовал некоторое время назад). По сути, tibble пытается сделать умные предположения о том, как обращаться с векторами или списками привязки столбцов различной длины. Эти предположения согласуются с тем, как остальная часть R выполняет векторную переработку, но вы, как правило, не хотите использовать ту же логику переработки с колонками списка.

Решение состоит в том, чтобы заключить ваш список в другой список, чтобы tibble интерпретировал новое значение как отдельный элемент и повторял его, а не перерабатывал элементы списка.

df$my.lists <- list(list("boo", "bah"))

Предпочтительный подход может измениться в следующей версии tibble, для получения дополнительной информации см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...