Условная сортировка / изменение элементов из вложенных (символьных) списков в новые столбцы в R - PullRequest
0 голосов
/ 28 января 2020

У меня есть следующий фрейм данных, который был создан из вопросника:

id <- c(1, 2, 3, 4, 5)
type <- c("1,2,3", "2", "2,3,4", "4", "1")
ex_df <- data.frame(id, a, stringsAsFactors=F)

ex_df$type имеет классовый характер, и каждый ди git представляет тип шахматной фигуры:

1 = pawn
2 = rook
3 = knight
4 = bishop

Я хотел бы создать отдельный столбец для каждого типа шахматной фигуры с указанием наличия / отсутствия на основе символов в столбце ex_df$type, где 1 указывает, что шахматная фигура находится в списке, а 0 что это не так.

Конечный фрейм данных должен выглядеть следующим образом:

'data.frame':   5 obs. of  6 variables:
 $ id    : num  1 2 3 4 5
 $ type  : chr  "1,2,3" "2" "2,3,4" "4" ...
 $ pawn  : num  1 0 0 0 1
 $ rook  : num  1 1 1 0 0
 $ knight: num  1 0 1 0 0
 $ bishop: num  0 0 1 1 0

В табличной форме:

id  type pawn rook knight bishop
 1 1,2,3    1    1      1      0
 2     2    0    1      0      0
 3 2,3,4    0    1      1      1
 4     4    0    0      0      1
 5     1    1    0      0      0

Пока я пытался преобразовать ex_df$type в список с числовыми значениями c, используя strsplit(), чтобы затем использовать вложенный lapply() с dplyr mutate() в сочетании с when_case(), но это не сработало. У меня проблемы с вложенными списками, поэтому, возможно, мой подход не верный?

Я тщательно искал перед публикацией, но мне кажется, что я упускаю что-то очень очевидное, например функцию, о которой я не знаю это делает именно это. Возможно, я не ищу решения в правильном направлении?

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Мы можем использовать tidyverse, чтобы сделать это

library(dplyr)
library(tidyr)
ex_df %>% 
   separate_rows(type, convert = TRUE) %>% 
   mutate(type = c('pawn', 'rook', 'knight', 'bishop')[type], n = 1) %>% 
   pivot_wider(names_from = type, values_from = n, values_fill = list(n = 0)) %>% 
   left_join(ex_df)%>% 
   select(names(ex_df), everything())
#   id  type pawn rook knight bishop
#1  1 1,2,3    1    1      1      0
#2  2     2    0    1      0      0
#3  3 2,3,4    0    1      1      1
#4  4     4    0    0      0      1
#5  5     1    1    0      0      0
0 голосов
/ 28 января 2020

Мы можем использовать cSplit_e из splitstackshape, чтобы создать двоичное представление значений через запятую в type и затем изменить имена столбцов.

output <- splitstackshape::cSplit_e(ex_df, "type", type = "character", fill = 0)
names(output)[-c(1, 2)] <- c('pawn', 'rook', 'knight', 'bishop')
output

#  id  type pawn rook knight bishop
#1  1 1,2,3    1    1      1      0
#2  2     2    0    1      0      0
#3  3 2,3,4    0    1      1      1
#4  4     4    0    0      0      1
#5  5     1    1    0      0      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...