user1700890
user1700890

Reputation: 7732

dcast in R - creating pivot table

Here is my example

Student <- c('A',  'B', 'B')
Assessor <- c('C',  'D', 'D')
Score <- c(1, 5, 7)
df <- data.frame(Student, Assessor, Score)
df <- dcast(df, Student ~ Assessor,fun.aggregate=(function (x) x), value = 'Score')
print(df)

The output:

Using Score as value column: use value.var to override.
Error in .fun(.value[0], ...) : unused argument (value = "Score")

While I want to get something like

    C    D
A   1    NaN
B   NaN  5
B   NaN  7

What I am missing?

In addition, if I replace Score with

Score <- c('foo', 'bar','bar')

The output will be:

Using Score as value column: use value.var to override.
Error in .fun(.value[0], ...) : unused argument (value = "Score")

Any thoughts?

Upvotes: 0

Views: 1731

Answers (2)

jeremycg
jeremycg

Reputation: 24945

Using the dev version of tidyr (0.3.0) get it from github.

First we complete the combinations of Student/Assessor, then we nest it all into a list, spread and then unnest the list into new rows.

library(dplyr)
library(tidyr)
df %>% complete(Student, Assessor) %>%
       nest(Score) %>%
       spread(Assessor, Score) %>%
       unnest(C) %>%
       unnest(D)


  Student  C  D
1       A  1 NA
2       B NA  5
3       B NA  7

Upvotes: 0

SabDeM
SabDeM

Reputation: 7190

Since dcast spread among unique values of the left side of the formula I think you can achieve your goal with a (not so elegant hack) but I bet there are other ways to do that with table maybe.

 library(reshape2)
 dcast(df, Student + Score ~ ...)[-2]
Using Score as value column: use value.var to override.
  Student  C  D
1       A  1 NA
2       B NA  5
3       B NA  7

The hack is to just spread by remaining Student and Score the same and then spread other variables (in this case Assessor) and the with [-2] remove the Score column in order to get the desired output (unless your first column is made by column names actually, which is impossible in base R; in that case you need a data.table solution)

Upvotes: 2

Related Questions