Unlist / unnest для символьного вектора в кадре данных? - PullRequest
0 голосов
/ 23 января 2019

Существует ли какая-либо функция или способ отмены или удаления вектора в пределах кадра данных с использованием dplyr?У меня есть следующий пример.

library(tidyverse)
df <- tibble(x = 
      c("c(\"Police\", \"Pensions\")",
        "c(\"potato\", \"sweetpotato\")"))
df
# A tibble: 2 x 1
  x                               
  <chr>                           
1 "c(\"Police\", \"Pensions\")"   
2 "c(\"potato\", \"sweetpotato\")"

Я бы хотел перевести этот столбец данных в такой формат.

> df
# A tibble: 4 x 1
  x          
  <chr>      
1 Police     
2 Pensions   
3 Potato     
4 Sweetpotato

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Поскольку у вас есть R-код, хранящийся в строках, я думаю, что естественно использовать eval(parse(text= your_input)).

Используя unnest поверх него вы получите:

df %>% 
  mutate(x = map(x,~eval(parse(text=.)))) %>% 
  unnest

# A tibble: 4 x 1
#             x
#         <chr>
# 1      Police
# 2    Pensions
# 3      potato
# 4 sweetpotato
0 голосов
/ 23 января 2019

Один из вариантов: separate_rows

library(tidyverse)
df %>% 
    separate_rows(x) %>%
    filter(!x %in% c('c', ''))
# A tibble: 4 x 1
#  x          
#  <chr>      
#1 Police     
#2 Pensions   
#3 potato     
#4 sweetpotato

ПРИМЕЧАНИЕ. Было бы быстрее / эффективнее разделить и filter


. Или другой вариант - извлечь слова междуth кавычки, а затем unnest

df %>% 
   mutate(x = str_extract_all(x, '(?<=")[A-Za-z]+')) %>%
   unnest
# A tibble: 4 x 1
#  x          
#  <chr>      
#1 Police     
#2 Pensions   
#3 potato     
#4 sweetpotato

Контрольные отметки

При немного больших данных,

df1 <- df[rep(1:nrow(df), each = 1e5), ]

system.time({
df1 %>% 
    separate_rows(x) %>%
    filter(!x %in% c('c', ''))


})
#. user  system elapsed 
#  0.916   0.033   0.939 


system.time({
df1 %>%
 mutate(x = str_extract_all(x, '(?<=")[A-Za-z]+')) %>%
   unnest

})
#  user  system elapsed 
#  0.763   0.015   0.773 


system.time({

df1 %>% 
  mutate(x = map(x,~eval(parse(text=.)))) %>% 
  unnest

})
#user  system elapsed 
# 15.643   1.813  17.375 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...