2017-04-08 18 views
4

の次の値に数調整データフレームID、グレード、およびいくつかの2値変数(0,1)計算R

ID <- c(1,2,3,4,5,6,7,8,9,10) 
grade <- c("a", "b", "e", "a", "d", "d", "a", "c", "c", "b") 
b1 <- c(1,0,0,0,0,0,0,0,0,0) 
b2 <- c(1,1,0,0,0,1,0,1,0,0) 
b3 <- c(1,0,0,1,1,0,0,1,0,0) 
b4 <- c(1,1,0,0,0,1,0,1,0,0) 
b5 <- c(1,1,1,1,1,1,0,1,1,0) 
b6 <- c(1,1,1,1,1,1,1,1,1,0) 
df <- data.frame(ID, grade, b1, b2, b3, b4, b5, b6) 

が含まI新しい整数列を作成する必要がある(Yそれを呼び出す)が1から6

これらの方法に値Yはれる後行の値がすべての人のであること(B6にB1)に第1の位置に戻すことによって、ある計算しなければなりません。例えば

for ID=1, y=1 
    ID=2, y=4 
    ID=3, y=5 

は、しかし、すべての値がB6にB1にゼロである場合、 "いいえ" を返します。

また、高速なコード、より良いです。

答えて

2

最初に列を連結し、次に正規表現を使用して連続一致の位置を決定することができます。これは正規表現のnegative lookaroundを使用して行うことができます。

Rich Scrivenのおかげで、このようなペーストができます。

flag1 <- do.call("paste0",df[,3:8]) 
df$flag1 <- flag1 

library(stringr) 
df$flag2 <- str_locate(flag1,"(?!=0)1{1,}$")[,"start"] 
df <- data.frame(df) 
df[is.na(df$flag2),"flag2"] <- 0 

回答FLAG2列である:、

ID grade b1 b2 b3 b4 b5 b6 flag1 flag2 
1 1  a 1 1 1 1 1 1 111111  1 
2 2  b 0 1 0 1 1 1 010111  4 
3 3  e 0 0 0 0 1 1 000011  5 
4 4  a 0 0 1 0 1 1 001011  5 
5 5  d 0 0 1 0 1 1 001011  5 
6 6  d 0 1 0 1 1 1 010111  4 
7 7  a 0 0 0 0 0 1 000001  6 
8 8  c 0 1 1 1 1 1 011111  2 
9 9  c 0 0 0 0 1 1 000011  5 
10 10  b 0 0 0 0 0 0 000000  0 
+1

ありがとうございました。できます。 – user9292

+0

@RichScrivenを追加しました!指摘いただき、ありがとうございます – PKumar

1

"DF" の構造とモードを利用する単純明快なアプローチを検索することであるstringrを使用

「B *」の列を通って、最後の0の場所格納します

cols = paste("b", 1:6, sep = "") 

y = integer(nrow(df)) 
for(j in seq_along(cols)) y[!df[[cols[j]]]] = j 

y 
#[1] 0 3 4 4 4 3 5 1 4 6 

と1の最後のシリーズの最初の1の場所を取得:

y = y + 1L 
y[y > length(cols)] = 0L 

y 
#[1] 1 4 5 5 5 4 6 2 5 0