2011-08-05 109 views

回答

3

我認爲你可以做到這一點使用簡單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 
+2

+1這基本上是做一個'rep.data中的R方式.frame()'方法而不實現它。最近在R-Devel IIRC上討論了這個問題,其中不少於Martin Maechler提倡這種索引解決方案(儘管最初的索引解決方案由David Winsemius IIRC提供)。 –

+0

非常感謝Joran。我知道必須有一種更優雅的方式來進行循環。它並沒有比單班輪更好。 – user880978

0

幾個選項涌現在腦海裏,使用您的數據爲例:

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 
+0

糟糕,最後一個是@ joran的答案中的變體。 –

+0

非常感謝你,Gavin。我喜歡你的第一個解決方案。 – user880978