pivot_wider, когда столбец значений отсутствует - PullRequest
6 голосов
/ 05 марта 2020

Я пытаюсь изменить набор данных от длинного до широкого. Следующий код работает, но мне любопытно, есть ли способ не предоставлять столбец значений и все равно использовать pivot_wider. В следующем примере мне нужно создать временный столбец "val", чтобы использовать pivot_wider, но есть ли способ сделать это без него?

a <- data.frame(name = c("sam", "rob", "tom"),
                 type = c("a", "b", "c"))
a
  name type
1  sam    a
2  rob    b
3  tom    c

Я хочу преобразовать его следующим образом.

name      a     b     c
1 sam       1     0     0
2 rob       0     1     0
3 tom       0     0     1 

Это можно сделать с помощью следующего кода, но я могу сделать это без создания столбца "val" (и все же с использованием языка Tidyverse)?

a <- data.frame(name = c("sam", "rob", "tom"),
                type = c("a", "b", "c"), 
                val = rep(1, 3)) %>%
  pivot_wider(names_from = type, values_from = val, values_fill = list(val = 0))

Ответы [ 3 ]

6 голосов
/ 05 марта 2020

Мы можем mutate со столбцом 1 с и использовать это в pivot_wider

library(dplyr)
library(tidyr)
a %>%
     mutate(n = 1) %>% 
     pivot_wider(names_from = type, values_from = n, values_fill = list(n = 0))
# A tibble: 3 x 4
#  name      a     b     c
#  <fct> <dbl> <dbl> <dbl>
#1 sam       1     0     0
#2 rob       0     1     0
#3 tom       0     0     1

В base R, это будет проще ..

table(a)
6 голосов
/ 05 марта 2020

Идя в старшую школу, reshape2::dcast или процветающий data.table::dcast, позвольте вам сделать это, указав статистическую функцию:

reshape2::dcast(a, name ~ type, fun.aggregate = length)
#   name a b c
# 1  rob 0 1 0
# 2  sam 1 0 0
# 3  tom 0 0 1

data.table::dcast(setDT(a), name ~ type, fun.aggregate = length)
#    name a b c
# 1:  rob 0 1 0
# 2:  sam 1 0 0
# 3:  tom 0 0 1
6 голосов
/ 05 марта 2020

Вы можете использовать аргумент values_fn для присвоения 1 и values_fill для присвоения 0:

library(tidyr)

pivot_wider(a, names_from = type, values_from = type, values_fn = list(type = ~1), values_fill = list(type = 0))

# A tibble: 3 x 4
  name      a     b     c
  <fct> <dbl> <dbl> <dbl>
1 sam       1     0     0
2 rob       0     1     0
3 tom       0     0     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...