我有以下形式的data.frame或基質:R:重量與可變從data.frame要定期data.frame
柱名稱:X,Y,頻率
a, 1, 3
b, 4, 2
最後一列是一個權重變量。我如何將它轉換成沒有重量的data.frame/matrix?
a, 1
a, 1
a, 1
b, 4
b, 4
我有以下形式的data.frame或基質:R:重量與可變從data.frame要定期data.frame
柱名稱:X,Y,頻率
a, 1, 3
b, 4, 2
最後一列是一個權重變量。我如何將它轉換成沒有重量的data.frame/matrix?
a, 1
a, 1
a, 1
b, 4
b, 4
我認爲你可以做到這一點使用簡單subseting:
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
幾個選項涌現在腦海裏,使用您的數據爲例:
dat <- data.frame(X = c("a", "b"), Y = c(1,4), Freq = c(3,2),
stringsAsFactors = FALSE)
第一個選項s是:
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
糟糕,最後一個是@ joran的答案中的變體。 –
非常感謝你,Gavin。我喜歡你的第一個解決方案。 – user880978
+1這基本上是做一個'rep.data中的R方式.frame()'方法而不實現它。最近在R-Devel IIRC上討論了這個問題,其中不少於Martin Maechler提倡這種索引解決方案(儘管最初的索引解決方案由David Winsemius IIRC提供)。 –
非常感謝Joran。我知道必須有一種更優雅的方式來進行循環。它並沒有比單班輪更好。 – user880978