2016-03-01 40 views
0

(序言部分) 我不知道這是否是正確的地方...我實際上有一個問題解決/優化問題,用於計算表格。所以如果不是。非常抱歉,值得減。數據表中的特殊發生次數

這裏的數據幀

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 
} 
+0

在第二行中,您會從1到0兩次,不是? –

+0

對!我改變了這個例子!謝謝! – Stefano

+0

此外,第3行沒有從零到1的單個值另外,您始終具有0:2的值,或者您可以有任何值? –

回答

2

不知道我是否完全得到它,但你可以嘗試:

cbind(dat["id"],N0=rowSums(dat[,3:7]==1 & dat[,2:6]!=1)+(dat[,2]==1), 
       N1=rowSums(dat[,3:7]==0 & dat[,2:6]==1)) 
# id N0 N1 
#1 a 1 1 
#2 b 2 1 
#3 c 1 1 
#4 d 2 1 
#5 e 2 2 
+0

ouch !!從1跳到0和0到1。如此緊湊! :) 非常感謝! – Stefano

+0

只有一個精度。在N0應該是'dat [,3:7] == 1&dat [,2:6] == 0'我猜 – Stefano

+1

哦,當然,這取決於你想要實現的邏輯。如果你想計算「0到1」轉換的次數,當然。在這個答案中,我計算了「任意1」轉換的數量。我想你有了這個想法,並可以改變任何適合你的價值觀。 – nicola

1

這裏的另一種方式,利用rle包裹在data.table語法:

library(data.table) 
setDT(dat) 

melt(dat, id="id")[, with(rle(value), list(
    n1 = sum(values==1), 
    n1to0 = sum("10" == do.call(paste0, shift(values, 1:0, fill=0))) 
)), by=id] 

# id n1 n1to0 
# 1: a 1  1 
# 2: b 2  1 
# 3: c 1  1 
# 4: d 2  1 
# 5: e 2  2 

注。

  • shiftn=1:0返回滯後矢量(第1滯後)和載體本身(0延遲)。
  • melt創建一個value列;和rle包含values載體。