从R中的频率表创建具有单独试验的表(表函数的反转)

时间:2014-04-02 20:35:44

标签: r cross-validation frequency

我在R列出因子级别data.frame中有一个数据频率表,以及成功和失败的计数。我想把它从频率表变成一个事件列表 - 即"表"的对面命令。具体来说,我想转此:

factor.A factor.B success.count fail.count
-------- -------- ------------- ----------
 0        1        0             2
 1        1        2             1

进入这个:

factor.A factor.B result 
-------- -------- -------
 0        1        0
 0        1        0
 1        1        1
 1        1        1
 1        1        0

在我看来,reshape应该这样做,甚至是一些我没有听说过的模糊的基础功能,但我没有运气。即使重复data.frame的单个行也很棘手 - 如何将可变数量的参数传递给rbind

提示?

背景: 为什么?因为与聚合二项式数据相比,交叉验证对这样的数据集的逻辑拟合更容易。

我使用广义线性模型分析我作为R中的二项式回归,并希望交叉验证以控制我数据的正则化,因为我的目的是预测性的。

然而,据我所知,R中的默认交叉验证例程对于二项式数据并不是很好,只是跳过频率表的整行,而不是单独进行试验。这意味着轻度和重度采样因子组合在我的成本函数中具有相同的权重,这不适合我的数据。

3 个答案:

答案 0 :(得分:3)

你可以试试这个:

# create 'result' vector
# repeat 1s and 0s the number of times given in the respective 'count' column
result <- rep(rep(c(1, 0), nrow(df)), unlist(df[ , c("success.count", "fail.count")]))

# repeat each row in df the number of times given by the sum of 'count' columns
data.frame(df[rep(1:nrow(df), rowSums(df[ , c("success.count", "fail.count")]) ), c("factor.A", "factor.B")], result)

#     factor.A factor.B result
# 1          0        1      0
# 1.1        0        1      0
# 2          1        1      1
# 2.1        1        1      1
# 2.2        1        1      0

答案 1 :(得分:0)

试试这个

  x = matrix( c(0, 1, 1, 1, 0 , 2, 2, 1), 2, 4)
  r= c()
  for(i in 1:nrow(x)) {
    r = c(r, rep(c(x[i, 1:2], 1), x[i, 3]))
    r = c(r, rep(c(x[i, 1:2], 0), x[i, 4]))
  }
  t(matrix(r, nrow= 3))

答案 2 :(得分:0)

对于tidyverse风格的解决方案,您可以

library(tidyverse)

df %>% gather(key = result, value = incidence, success.count, fail.count) %>% 
     mutate(result = if_else(result %>% str_detect("success"), 1, 0)) %>%
     pmap_dfr(function(factor.A, factor.B, result, incidence) 
                   { tibble(factor.A = factor.A,
                            factor.B = factor.B,
                            result = rep(result, times = incidence)
                            )
                   }
               )