2017-06-21 24 views
0

我有此計數連續值三次,每次在一個數據幀中的R

df<-cbind(
t1=c(1,1,1), 
t2=c(1,1,1), 
t3=c(0,1,1), 
t4=c(1,0,1), 
t5=c(1,1,1), 
t6=c(1,1,1), 
t7=c(1,1,0), 
t8=c(0,1,1), 
t9=c(1,1,1)) 


> df 
    t1 t2 t3 t4 t5 t6 t7 t8 t9 
[1,] 1 1 0 1 1 1 1 0 1 
[2,] 1 1 1 0 1 1 1 1 1 
[3,] 1 1 1 1 1 1 0 1 1 

和我需要計數每行中的「一」在T3,T6和T9。 每次計數器到達3必須回零並重新開始。

在這種情況下的結果應該是:

new_t3 = 0, 3, 3 

new_t6 = 3, 2, 3 

new_t9= 1, 3, 2 

我怎麼能指望這些連續的「個位」的值在T3,T6和T9? 我看過rle,但我仍然遇到麻煩!

任何幫助:)感謝

+3

爲什麼new_t3的第一個值是0,而不是2?是不是在t3之前有兩個'1'?或者我沒有得到什麼? – digEmAll

+0

此外,你想每3個元素重置爲零,或者只有當總和達到3時才重置爲零?請給出你的算法的更多細節......目前你的預期結果似乎是錯誤的根據你的解釋...可能一步一步解釋第一行可能就足夠了 – digEmAll

+0

弗雷德我無法理解你的結果鏈接。 – Balter

回答

1

像這樣的東西可以工作(編輯以解決數以0結尾):

dat <- as.data.frame(df) 
new_t3 <- c() 
for(i in 1:3){ 
    if(dat[i,3] != 0){ 
     count <- rle(dat[i,1:3]) 
     new_t3 <- append(new_t3, count$length[count$values == 1]) 
    } else{ 
     new_t3 <- append(new_t3, 0) 
    } 
} 

這遍歷每個行的列t1t3和用途用rle函數計算連續值的個數。 count$length[count$values == 1]訪問由rle返回的對象中等於1的連續計數。你必須爲每個你正在計算列組做到這一點,例如:

new_t6 <- c() 
for(i in 1:3){ 
    if(dat[i,6] != 0){ 
     count <- rle(dat[i,4:6]) 
     new_t6 <- append(new_t6, count$length[count$values == 1]) 
    } else{ 
     new_t6 <- append(new_t6, 0) 
    } 
} 

或以某種方式包裝的循環中的函數或嵌套for循環自動在一個表。但它看起來像返回您的示例中的值。請注意,對於new_t9,此方法返回1 1 3 2,因爲第一行中有兩個單獨的1值(1 0 1)。如果您需要避免該類型的結果(可能使用uniquemax),則可能必須對count變量執行一些操作。

df更改爲允許rle工作的數據框對象,否則無法訪問這些值。

+0

我不明白爲什麼在new_t3你得到** 2,3,3 **,那個櫃檯在t3應該是空的。另外,我明白new_t9的重點,我只會在df中選擇正確的1。非常感謝! –

+0

new_t3是2,3,3,因爲在第一行中有兩個連續的1(然後在第2行和第3行中有3和3)。從其他人的看法看來,其他人也期待2,3,3 - 你是不是將第一排中的兩個連續1排除在外? – Bird

+0

是的,我不能計算0之前的1,因爲在t3的第一行中計數器是空的。 t9的不同故事。我知道有點困惑(t3,t6和t9是我計數的時代)。 –

1

下面是一個使用好老for循環地結合在一起,可能的方法適用於:

aggregateRow <- function(row){ 
    result <- rep(NA,length(row) %/% 3) 
    cumul <- 0 
    for(i in 1:length(row)){ 
    cumul <- cumul + row[i] 
    if(i %% 3 == 0){ 
     if(row[i] == 0) 
     cumul = 0 
     if(cumul > 3) 
     cumul = cumul - 3 
     result[i %/% 3] = cumul 
    } 
    } 
    return(result) 
} 

res <- t(apply(df,1,aggregateRow)) 
row.names(res) <- paste0('new_t',c(3,6,9)) # just to give names to the rows 
> res 
     [,1] [,2] [,3] 
new_t3 0 3 2 
new_t6 3 2 2 
new_t9 3 3 2 
+0

Brillant !! ...但是在new_t3(考慮從t7到t9的數據)結果應該是1,3,2。每行中的計數器達到3時停止計數並得到最大值3,當找到從零開始。也許我沒有很好地解釋這個過程。任何方式都非常感謝! –

相關問題