【问题标题】:R: Going from a data.frame with weight variable to a regular data.frameR:从具有权重变量的 data.frame 转到常规 data.frame
【发布时间】:2011-08-05 16:55:36
【问题描述】:

我有以下形式的 data.frame 或矩阵:

列名:XYFreq

a, 1, 3
b, 4, 2

最后一列是权重变量。如何将其转换为没有权重的 data.frame/matrix?

a, 1
a, 1
a, 1
b, 4
b, 4

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我认为你可以使用简单的子集来做到这一点:

    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
    

    【讨论】:

    • +1 这本质上是在 R 中执行 rep.data.frame() 方法而不实现它的方式。最近在 R-Devel IIRC 上对此进行了讨论,其中不亚于 Martin Maechler 提倡这种索引解决方案(尽管最初的索引解决方案是由 David Winsemius IIRC 提供的)。
    • 非常感谢乔兰。我知道必须有一种比 for 循环更优雅的方式。它没有比单线更好的了。
    【解决方案2】:

    以您的数据为例,我想到了几个选项:

    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
    

    【讨论】:

    • 糟糕,最后一个是@joran 答案的变体。
    • 非常感谢你,Gavin。我非常喜欢你的第一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多