2017-04-08 33 views
4

的數據幀包含ID,等級,和幾個二進制變量(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) 

我需要創建一個新的整數列(稱之爲Y),其具有1至6

他們方式值來計算y是通過返回在第一1的位置(B1到B6),在該後,該行中的值全部是人的。

例如:

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

但是,如果所有值都在B1至B6零,則返回 「不」。

此外,更快的代碼,就更好了。

回答

2

我們先連接列,然後我們可以使用正則表達式來確定連續匹配的位置。我們可以使用正則表達式的negative lookaround來做到這一點。

由於豐富斯克裏芬爲paste0伎倆。

使用stringr

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」 的結構和模式,是搜索通過「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的位置:

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

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