2014-10-29 69 views
2

我試圖將包含狀態的ID列表轉換爲一種相同長度的矩陣。我很努力的事實,我需要保持一個狀態開/關,直到它改變。轉換列表爲相同長度的特殊矩陣

有沒有人有一個想法如何從這裏開始或指向我的方法,可以嘗試應用?

在我的輸入(左側)以及所需的輸出(右側)下方。

 
+----+--------+------+---+---+---+ 
| ID | STATUS | - | a | b | c | 
+----+--------+------+---+---+---+ 
| a | ON  | - | 1 | 0 | 0 | 
| a | OFF | - | 0 | 0 | 0 | 
| a | ON  | - | 1 | 0 | 0 | 
| b | ON  | - | 1 | 1 | 0 | 
| b | OFF | - | 1 | 0 | 0 | 
| b | ON  | - | 1 | 1 | 0 | 
| a | OFF | - | 0 | 1 | 0 | 
| c | ON  | - | 0 | 1 | 1 | 
| b | OFF | - | 0 | 0 | 1 | 
| c | OFF | - | 0 | 0 | 0 | 
+----+--------+------+---+---+---+ 

任何意見或提示表示讚賞。

回答

2

的第一行創建一個n乘3矩陣,xna,其列對應於a,bc,如果ID等於列名稱,則其元素爲dat$STATUS的對應值,否則爲NA。然後我們將ONOFF轉換爲10,給出x01。最後,我們插入一個虛擬的第一行零,然後使用來自動物園的na.locf填充NA值,刪除剛剛插入的虛擬行。

library(zoo) 

xna <- ifelse(sapply(unique(dat$ID), "==", dat$ID), dat$STATUS, NA) 
x01 <- (xna == "ON") + 0 
data.frame(dat, na.locf(rbind(0, x01))[-1, ]) 

結果是

ID STATUS a b c 
1 a  ON 1 0 0 
2 a OFF 0 0 0 
3 a  ON 1 0 0 
4 b  ON 1 1 0 
5 b OFF 1 0 0 
6 b  ON 1 1 0 
7 a OFF 0 1 0 
8 c  ON 0 1 1 
9 b OFF 0 0 1 
10 c OFF 0 0 0 

更新縮短碼。

+0

非常感謝,我會從我身邊檢查這個建議,並會在此留言。 – kukuk1de 2014-10-29 17:55:43

+0

我已經檢查了更大的數據集,它工作得很好,也給出了預期的結果。此外,我喜歡從動物園包中使用此功能而不是循環的想法。再次感謝你的幫助! – kukuk1de 2014-10-30 09:10:16

0

我假設你的意思是你想按順序和遞增地應用狀態條件。因此,行4:6的A爲1,因爲A在第3行打開,但尚未關閉。

要做到這一點,你可以做到這一點。它使用一個for循環是不是「R-ISH」,但它是完成我想你問

# the data 
status <- 
    data.frame(ID=c('a','a','a','b','b','b','a','c','b','c'), 
      STATUS=c('ON','OFF','ON','ON','OFF','ON','OFF','ON','OFF','OFF'), 
      stringsAsFactors=F) 

# unique cols 
unq_cols <- unique(status$ID) 

# set up, empty matrix and default row of 3 'offs' 
out_mat <- NULL 
temp_row <- c(0,0,0) 

# apply the status conditions in order 
for (i in 1:nrow(status)) { 
    col_pos <- grep(status[i, 'ID'], unq_cols) 
    temp_row[col_pos] <- ifelse(status[i, 'STATUS']=='ON', 1, 0) 
    out_mat <- rbind(out_mat, unname(temp_row)) 
} 

# here's your matrix 
out_mat 

輸出,它匹配你所擁有的上述簡單的方法:

 [,1] [,2] [,3] 
[1,]  1 0 0 
[2,]  0 0 0 
[3,]  1 0 0 
[4,]  1 1 0 
[5,]  1 0 0 
[6,]  1 1 0 
[7,]  0 1 0 
[8,]  0 1 1 
[9,]  0 0 1 
[10,] 0 0 0 
+0

非常感謝,我也會檢查這種方法。 – kukuk1de 2014-10-29 17:58:28