【问题标题】:Efficient way to create a Winner/Looser Contingency-Table创建赢家/输家列联表的有效方法
【发布时间】:2019-07-04 20:51:00
【问题描述】:

我对 R 比较陌生,需要一些帮助。

我想生成一个 2x2 列联表,并始终按如下方式比较连续两天:您从第一行开始并取值的中位数,在我的示例中,在 2019-02-11 行中,这将是值15 来自 x4。现在所有高于中位数的值都是“赢家”,低于中位数的都是“输家”。

在第二步中,您对 2019-02-12 行执行相同操作,例如,如果 x1 在两个期间都是“赢家”,则它应计入列联表中的“赢家/赢家”字段。对于所有连续日期,“loser/loser”、“winner/loser”、“loser/winner”等都是相同的。

我有一个包含大约 200 列的数据框,因此正在寻找一种有效的方法来执行此操作。

我的代码如下所示:

            set.seed(123)
            d <- data.frame(Time = rep(seq.Date( Sys.Date(), length=30, by="day" )),
            x1 = rep(sample(10:30, 10), 3),
            x2 = rep(sample(10:30, 10), 3),
            x3 = rep(sample(10:30, 10), 3),
            x4 = rep(sample(10:30, 10), 3),
            x5 = rep(sample(10:30, 10), 3))

非常感谢。

【问题讨论】:

    标签: r contingency


    【解决方案1】:

    通过一些算术,我认为我们可以非常有效地做到这一点。

    首先,我们找到赢家和输家,并相应地为他们分配01。接下来,我们可以进行列差异来找出连续两天是输/赢(1)还是赢输(-1)。由于赢/赢和输/输都会导致差异为零,我们还必须检查第一个值是什么。剩下的只是重新编码和组装。

    d <- structure(list(Time=structure(17942:17947, class="Date"),
    x1=c(NA, NA, 17L, 29L, 27L, 10L), x2=c(30L, 19L, 22L, 20L, 11L,
    24L), x3=c(NA, 23L, 22L, 27L, 21L, 26L), x4=c(30L, 28L, 23L,
    24L, 10L, 17L), x5=c(12L, 18L, 17L, 16L, 30L, 26L)),
    row.names=c(NA, 6L), class="data.frame")
    
    x <- t(apply(d[,-1], 1, function(x) x > median(x, na.rm=TRUE)))
    nr <- nrow(x)
    dx <- diff(x)
    
    lw <- (dx == 1)*1
    wl <- (dx == -1)*2
    dd <- (dx == 0)
    ww <- (dd & x[-nr,] == 1)*3
    ll <- (dd & x[-nr,] == 0)*4
    
    tab <- c("lose/win", "win/lose", "win/win", "lose/lose")[lw + wl + ww + ll]
    
    d0 <- d
    d0[-1,-1] <- tab
    d0
    
    #         Time       x1        x2       x3        x4        x5
    # 1 2019-02-15     <NA>        30     <NA>        30        12
    # 2 2019-02-16     <NA> lose/lose     <NA>  lose/win lose/lose
    # 3 2019-02-17     <NA> lose/lose win/lose   win/win lose/lose
    # 4 2019-02-18 lose/win lose/lose lose/win  win/lose lose/lose
    # 5 2019-02-19  win/win lose/lose win/lose lose/lose  lose/win
    # 6 2019-02-20 win/lose lose/lose lose/win lose/lose   win/win
    

    【讨论】:

    • 谢谢!如果不是所有列都从同一时间日期开始,我该如何忽略 NA?例如,如果 x1 从第 3 行开始,第 1 行和第 2 行是 NA?我尝试了x &lt;- t(apply(d, 1, function(x){fft(x[!is.na(x)] &gt; median(x))} ),但这会在每一行中生成 NA。
    • @Pogi93:在对median() 的调用中指定na.rm=TRUE 就足够了。我更新了我的代码。
    • 谢谢!最后一个问题:我现在如何计算每行的所有不同组合而忽略 NA?
    • @Pogi93:我认为这最好作为一个单独的问题提出。
    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    相关资源
    最近更新 更多