(序言)我不知道这是不是正确的地方...我实际上有一个问题解决/优化问题的计数表 . 所以,如果不是 . 非常抱歉,值得贬低 .
这是数据框
dat <- data.frame(id=letters[1:5],matrix(c(0,0,1,0,0, 0,1,0,1,1, 0,0,2,1,0, 1,0,2,1,1, 0,0,2,0,0, 0,1,2,1,0),5,6))
#
# id X1 X2 X3 X4 X5 X6
# 1 a 0 0 0 1 0 0
# 2 b 0 1 0 0 0 1
# 3 c 1 0 2 2 2 2
# 4 d 0 1 1 1 0 1
# 5 e 0 1 0 1 0 0
我想计算每一行,我们得到多少次1和从1开始到多少次0所以最终的结果应该是
# id N1 N0
# a 1 1
# b 2 1
# c 1 1
# d 2 1
# e 2 2
我实际上找到了一个算法,但它更多的是C / FORTRAN风格(下面这里),我无法相信在R中没有更好的方式和更优雅的方式 . 非常感谢任何帮助或暗示 .
nr <- nrow(dat)
nc <- ncol(dat)
rownames(dat) <- seq(1,nr,1)
colnames(dat) <- seq(1,nc,1)
dat$N1 <- NULL
dat$N2 <- NULL
for (i in 1:nr) {
n1 <- 0
n0 <- 0
j <- 2
while (!(j>nc)) {
k <- j
if (dat[i,k] == 1) {
n1 <- n1 + 1
k <- j + 1
while (!(k>nc)) {
if (dat[i,k] == 0) {
n0 <- n0 + 1
break
}
k <- k + 1
}
}
j <- k
j <- j + 1
}
dat$N1[i] <- n1
dat$N0[i] <- n0
}
2 回答
不确定我是否完全得到它,但你可以尝试:
这是另一种方法,使用
rle
包装在data.table语法中:笔记 .
带有
n=1:0
的shift
返回滞后向量(滞后为1)和向量本身(滞后为0) .melt
创建value
列;和rle
包含values
向量 .