【发布时间】:2011-08-05 16:55:36
【问题描述】:
我有以下形式的 data.frame 或矩阵:
列名:X、Y、Freq:
a, 1, 3
b, 4, 2
最后一列是权重变量。如何将其转换为没有权重的 data.frame/matrix?
a, 1
a, 1
a, 1
b, 4
b, 4
【问题讨论】:
我有以下形式的 data.frame 或矩阵:
列名:X、Y、Freq:
a, 1, 3
b, 4, 2
最后一列是权重变量。如何将其转换为没有权重的 data.frame/matrix?
a, 1
a, 1
a, 1
b, 4
b, 4
【问题讨论】:
我认为你可以使用简单的子集来做到这一点:
dat <- data.frame(x=c('a','b'),y=c(1,4),wt = c(3,2))
dat[rep(1:nrow(dat),times = dat$wt),1:2]
产生这个:
x y
1 a 1
1.1 a 1
1.2 a 1
2 b 4
2.1 b 4
【讨论】:
rep.data.frame() 方法而不实现它的方式。最近在 R-Devel IIRC 上对此进行了讨论,其中不亚于 Martin Maechler 提倡这种索引解决方案(尽管最初的索引解决方案是由 David Winsemius IIRC 提供的)。
以您的数据为例,我想到了几个选项:
dat <- data.frame(X = c("a", "b"), Y = c(1,4), Freq = c(3,2),
stringsAsFactors = FALSE)
第一个选项是:
do.call(cbind.data.frame, lapply(dat[,-3], rep, times = dat[,3]))
第二个是一个小功能:
foo <- function(dat) {
data.frame(X = rep(dat$X, times = dat$Freq),
Y = rep(dat$Y, times = dat$Freq))
}
foo(dat)
另一个是:
> with(dat, dat[, 1:2][rep(seq_along(Freq), times = Freq),])
X Y
1 a 1
1.1 a 1
1.2 a 1
2 b 4
2.1 b 4
【讨论】: