另一种选择是使用长格式处理数据,然后再进行宽格式重塑。这是更好的方法,因为在数据框上逐行执行操作的成本很高。以下是使用修改过的Tim数据集的基本R解决方案。
reshape(dat[ave(dat$count, dat$Random, FUN=var) != 0, ],
direction="wide", idvar="Random", timevar="year")
在这里,
ave(dat$count, dat$Random, FUN=var)
选择具有非零方差的
dat$Random
值,并返回 TRUE。生成的向量用于对数据框进行子集化,然后使用基本 R 的
reshape
函数将其转换为所需的格式。
这将返回:
Random count.2000 count.2001 count.2002 count.2003 count.2004 count.2005
1 A 1 0 2 1 4 5
5 E 2 3 0 0 1 1
6 F 0 0 1 0 0 0
数据
dat <-
structure(list(Random = c("A", "B", "C", "D", "E", "F", "G",
"A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E", "F",
"G", "A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E",
"F", "G", "A", "B", "C", "D", "E", "F", "G"), year = c(2000,
2000, 2000, 2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001, 2001,
2001, 2001, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2003, 2003,
2003, 2003, 2003, 2003, 2003, 2004, 2004, 2004, 2004, 2004, 2004,
2004, 2005, 2005, 2005, 2005, 2005, 2005, 2005), count = c(1,
1, 0, 2, 2, 0, 3, 0, 1, 0, 2, 3, 0, 3, 2, 1, 0, 2, 0, 1, 3, 1,
1, 0, 2, 0, 0, 3, 4, 1, 0, 2, 1, 0, 3, 5, 1, 0, 2, 1, 0, 3)),
.Names = c("Random", "year", "count"), row.names = c(NA, -42L),
class = "data.frame")