Dcast without id variables

In his Introduction to reshape2 package, Sean S. Anderson provides the following example.

It uses quality data and renames column names

names(airquality) <- tolower(names(airquality))

      

The data looks like

#   ozone solar.r wind temp month day
# 1    41     190  7.4   67     5   1
# 2    36     118  8.0   72     5   2
# 3    12     149 12.6   74     5   3
# 4    18     313 11.5   62     5   4
# 5    NA      NA 14.3   56     5   5
# 6    28      NA 14.9   66     5   6

      

Then he melts them

aql <- melt(airquality, id.vars = c("month", "day"))

      

To obtain

#   month day variable value
# 1     5   1    ozone    41
# 2     5   2    ozone    36
# 3     5   3    ozone    12
# 4     5   4    ozone    18
# 5     5   5    ozone    NA
# 6     5   6    ozone    28

      

Finally, it gets the original (different column order) by

aqw <- dcast(aql, month + day ~ variable)

      

My Quesiton

Suppose now that we have no identifying variables (i.e. month and day) and melted the data like this

aql <- melt(airquality)

      

which look like

#   variable value
# 1    ozone    41
# 2    ozone    36
# 3    ozone    12
# 4    ozone    18
# 5    ozone    NA
# 6    ozone    28

      

My question is, how can I get the original ones? The initial ones will match

#   ozone solar.r wind temp 
# 1    41     190  7.4   67 
# 2    36     118  8.0   72 
# 3    12     149 12.6   74
# 4    18     313 11.5   62 
# 5    NA      NA 14.3   56
# 6    28      NA 14.9   66

      

+3


source to share


2 answers


Another variant: unstack

out <- unstack(aql,value~variable)
head(out)
#   ozone solar.r wind temp month day
#1    41     190  7.4   67     5   1
#2    36     118  8.0   72     5   2
#3    12     149 12.6   74     5   3
#4    18     313 11.5   62     5   4
#5    NA      NA 14.3   56     5   5
#6    28      NA 14.9   66     5   6

      

Since the question is about dcast

, we can create a sequence column and then usedcast



aql$indx <- with(aql, ave(seq_along(variable), variable, FUN=seq_along))
out1 <- dcast(aql, indx~variable, value.var='value')[,-1]
head(out1)
#   ozone solar.r wind temp month day
#1    41     190  7.4   67     5   1
#2    36     118  8.0   72     5   2
#3    12     149 12.6   74     5   3
#4    18     313 11.5   62     5   4
#5    NA      NA 14.3   56     5   5
#6    28      NA 14.9   66     5   6

      

If you are using data.table

devel version data.table

i.e. v1.9.5

also has a function dcast

. Devel version installation instructions:here

 library(data.table)#v1.9.5+
 setDT(aql)[, indx:=1:.N, variable]
 dcast(aql, indx~variable, value.var='value')[,-1]

      

+6


source


One option using split

,

out <- data.frame(sapply(split(aql, aql$variable), `[[`, 2))

      



Here the data is split into a column variable

, then the second column of each group is concatenated back into the data frame (the function [[

with the argument 2

is passed to sapply

)

head(out)
#   Ozone Solar.R Wind Temp Month Day
# 1    41     190  7.4   67     5   1
# 2    36     118  8.0   72     5   2
# 3    12     149 12.6   74     5   3
# 4    18     313 11.5   62     5   4
# 5    NA      NA 14.3   56     5   5
# 6    28      NA 14.9   66     5   6

      

+2


source







All Articles