我对R还是比较陌生,需要一些帮助。
我想生成一个2x2列联表,并始终将连续两天进行比较,如下所示:您从第一行开始并取值的中位数,在我的示例中为2019-02-11行来自x4的15。现在,所有高于中位数的值都是“赢家”,而下面的值都是“失败者”。
在第二步中,对行2019-02-12进行相同操作,例如,如果x1在两个期间均为“优胜者”,则它应计入列联表中的字段“优胜者/优胜者”。对于所有连续日期,“失败者/失败者”,“获胜者/失败者”,“失败者/胜利者”等均相同。
我有一个大约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))
非常感谢。
答案 0 :(得分:0)
通过一些算术运算,我认为我们可以有效地做到这一点。
首先,我们找到赢家和输家,并分别为其分配0
或1
。接下来,我们可以按列进行差分,以找出连续两天的输赢(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