Транспонировать сводную таблицу - PullRequest
0 голосов
/ 29 июня 2018

У меня есть таблица со следующим форматом в текстовом файле:

enter image description here

И мне нужно перенести это так, чтобы это выглядело так:

enter image description here

Есть ли простой способ сделать это в R?

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Решение, использующее reshape2::dcast и dplyr::summarise_at, может быть достигнуто путем изменения данных в wide-format и последующего связывания со строками сводки, чтобы включить Total. Решение будет таким:

library(tidyverse)
library(reshape2)

dcast(df, status~species, value.var = "count") %>%
  bind_rows(c(status = "Total",summarise_at(.,vars(A:C), funs(sum))))

#   status  A B  C
# 1  Alive 37 6 13
# 2   Dead 17 0 11
# 3  Total 54 6 24

Данные:

df <- read.table(text="
species status count
A Dead 17
A Alive 37
B Dead 0
B Alive 6
C Dead 11
C Alive 13",
header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 29 июня 2018

Мы могли бы использовать xtabs с addmargins с base R

addmargins(xtabs(count  ~ status + species, df), 1)
#       species
#status   A  B  C
#  Alive 37  6 13
#  Dead  17  0 11
#  Sum   54  6 24

данные

df <- structure(list(species = c("A", "A", "B", "B", "C", "C"),
 status = c("Dead", 
 "Alive", "Dead", "Alive", "Dead", "Alive"), count = c(17L, 37L, 
 0L, 6L, 11L, 13L)), .Names = c("species", "status", "count"), 
 class = "data.frame", row.names = c(NA, -6L))
0 голосов
/ 29 июня 2018
library(tidyverse)
 df1%>%
    spread(species,count)%>%
    rbind(c(status="Total",colSums(.[-1])))
  status  A B  C
1  Alive 37 6 13
2   Dead 17 0 11
3  Total 54 6 24

Чтобы сохранить класс как числовой, вы можете сделать:

 df1%>%
     spread(species,count)%>%
     rbind(cbind.data.frame(status="Total",t(colSums(.[-1]))))
  status  A B  C
1  Alive 37 6 13
2   Dead 17 0 11
3  Total 54 6 24
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...