I have the following data.frame
:
group <- sample(c("egyptian", "american", "irish", "australian"), 50, TRUE)
E <- c(rnorm(50, 5, 6))
F <- c(rnorm(50, 7.8, 4.5))
G <- c(rnorm(50, 65, 16.7))
test <- data.frame(group=group, E=E, F=F, G=G)
My goal is to generate a data.frame
that includes group
as a header and lists its corresponding values in E
below.
something like this data.frame
:
egyptian <- c(rnorm(50,5,6))
american<- c(rnorm(50,5,6))
irish<- c(rnorm(50,5,6))
australian<- c(rnorm(50,5,6))
test <- data.frame(egyptian=egyptian, american=american,
irish=irish, australian=australian)
I tried to subset the 2 columns and then use dcast,
but it failed.
Is it possible to dcast
2 columns from long to wide?
As @jbaums mentioned in the comments, the size of each group is not the same.
table(test$group)
# american australian egyptian irish
# 7 18 9 16
It is also better to set a seed to make it reproducible. i.e.
set.seed(1)
group <- sample(c("egyptian", "american", ....)
To transform initial input to the expected output (based on the "E" column), we may need to create a sequence based on the grouping variable ("group")
library(reshape2)
test$ind <- with(test, ave(seq_along(group), group, FUN=seq_along))
dcast(test, ind~group, value.var='E')
Or another base R
option would be to use xtabs
xtabs(E~ind+group, test)
But, note that this will pad '0' for those missing value combinations. For dcast
, by default, we will get "NA" for the missing combinations, which we can change by fill
argument.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With