这能在一条线上完成吗?这个例子是针对两个变量的,但是我想更多地使用它,这使得这种方法变得很麻烦。
library(ggplot2)
library(data.table)
library(dplyr)
a <- dcast(mpg, year ~ cyl, fun=length, value.var = "cyl")
b <- dcast(mpg, year ~ class, fun=length, value.var = "class")
c <- inner_join(a, b, by = "year")
> c
year 4 5 6 8 2seater compact midsize minivan pickup subcompact suv
1 1999 45 0 45 27 2 25 20 6 16 19 29
2 2008 36 4 34 43 3 22 21 5 17 16 33发布于 2019-12-15 16:17:44
如果我们使用data.table,那么首先使用melt并使用dcast
library(data.table)
dcast(melt(as.data.table(mpg[c('year', 'cyl', 'class')]),
id.var = 'year'), year ~ value)使用[]链接的版本如下所示:
mpg = as.data.table(mpg[c('year', 'cyl', 'class')])
mpg[ , melt(.SD, id.var = 'year')
][ , dcast(.SD, year ~ value, fun.aggregate=length)]或者使用来自recast的reshape2 (单线)
library(reshape2)
recast(mpg[c('year', 'cyl', 'class')], id.var = 'year', year ~ value)
# year 2seater 4 5 6 8 compact midsize minivan pickup subcompact suv
#1 1999 2 45 0 45 27 25 20 6 16 19 29
#2 2008 3 36 4 34 43 22 21 5 17 16 33注意:列“cyl”、“class”有不同的“类型”。但是,因为我们只是在找length,所以没问题
发布于 2019-12-15 16:19:40
我发现了一个非常简单但非常灵活的使用table的解决方案
(do.call(cbind, lapply(list("cyl", "class"), function(x) {
table(mpg[, c("year", x)])
})))
4 5 6 8 2seater compact midsize minivan pickup subcompact suv
1999 45 0 45 27 2 25 20 6 16 19 29
2008 36 4 34 43 3 22 21 5 17 16 33要获得更多变量,只需将它们添加到列表中即可。
(do.call(cbind, lapply(list("cyl", "class", "drv"), function(x) {
table(mpg[, c("year", x)])
})))
4 5 6 8 2seater compact midsize minivan pickup subcompact suv 4 f r
1999 45 0 45 27 2 25 20 6 16 19 29 49 57 11
2008 36 4 34 43 3 22 21 5 17 16 33 54 49 14https://stackoverflow.com/questions/59343907
复制相似问题