Предотвратить dcast от агрегирования данных - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть такие данные, как:

rating       title
5            Bean
5            Bean
4            Bean
5            Bean
5            Egg
4            Egg
3            Bacon
2            Bacon

И я хочу dcast, как

dcast(data, rating ~ title, value.var="rating")

Таким образом, заголовки становятся заголовками столбцов, а оценки для каждого заголовка перечислены ниже. Тем не менее, каждый раз, когда он объединяет их, но я не хочу этого.

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Это можно сделать с пакетом dplyr & tidyverse:

library(dplyr)
library(tidyverse)

data<-data.frame(rating=c(5,5,4,5,5,4,3,2),
                 title=c("Bean","Bean","Bean","Bean","Egg","Egg","Bacon","Bacon"))

Код:

data%>%mutate(dummy = 1:nrow(data)) %>% 
  spread(title, rating, fill = 0) %>% 
  select(-dummy)%>%t()

ВЫХОД:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
Bacon    0    0    0    0    0    0    3    2
Bean     5    5    4    5    0    0    0    0
Egg      0    0    0    0    5    4    0    0
0 голосов
/ 08 ноября 2018

Я предоставлю альтернативу, используя data.table, в случае, если ваше использование dcast имеет смысл. В отличие от других ответов, мне интересно, намерены ли вы сделать это для презентации фактического резюме, поскольку между различными рейтингами нет явной контекстуальной корреляции.

library(data.table)
DT <- fread('rating       title
5            Bean
5            Bean
4            Bean
5            Bean
5            Egg
4            Egg
3            Bacon
2            Bacon')

Сначала нам нужно назначить некоторый "id", который сохраняется в сводной таблице. Точно так же, поскольку это для представления (и мы, вероятно, хотим пробелы в неиспользуемых пробелах тис 0 или NA), я преобразую

DT$rating <- as.character(DT$rating)
DT[, id := seq_len(.N), by="title"]
DT
#    rating title id
# 1:      5  Bean  1
# 2:      5  Bean  2
# 3:      4  Bean  3
# 4:      5  Bean  4
# 5:      5   Egg  1
# 6:      4   Egg  2
# 7:      3 Bacon  1
# 8:      2 Bacon  2


dcast(DT, id ~ title, value.var = "rating", fill = "")[,id := NULL,][]
#    Bacon Bean Egg
# 1:     3    5   5
# 2:     2    5   4
# 3:          4    
# 4:          5    

Обратите внимание, что это не предназначено для расчетов и анализа, просто для представления. Если вы хотите сохранить все числа, то в итоге вы получите

# starting with fresh `DT`, no as.character done
DT[, id := seq_len(.N), by="title"]
dcast(DT, id ~ title, value.var = "rating")[,id := NULL,][]
#    Bacon Bean Egg
# 1:     3    5   5
# 2:     2    5   4
# 3:    NA    4  NA
# 4:    NA    5  NA

или при необходимости используйте dcast(..., fill=0) для замены NA с 0 с.

(В этом случае все еще не совсем ясно, как три значения в каждой отдельной строке связаны друг с другом, но, возможно, в ваших реальных данных / анализе есть смысл.)

0 голосов
/ 08 ноября 2018
read.table(text="rating       title
5            Bean
5            Bean
4            Bean
5            Bean
5            Egg
4            Egg
3            Bacon
2            Bacon", header=TRUE, stringsAsFactors=FALSE) %>%
  dplyr::mutate(id = 1:n()) %>% 
  tidyr::spread(title, rating, fill = 0) %>% 
  dplyr::select(-id)
##   Bacon Bean Egg
## 1     0    5   0
## 2     0    5   0
## 3     0    4   0
## 4     0    5   0
## 5     0    0   5
## 6     0    0   4
## 7     3    0   0
## 8     2    0   0
...