数据框包含ID,等级和几个二进制变量(0,1)
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中的所有值都为零,则返回&#34; no&#34;。
此外,代码越快越好。
答案 0 :(得分:2)
我们首先连接列,然后我们可以使用正则表达式来确定连续匹配的位置。我们可以使用正则表达式的negative lookaround
来完成此操作。
感谢 Rich Scriven 获取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 :(得分:1)
利用“df”结构和模式的一种简单直接的方法是搜索“b *”列并存储最后一个0的位置:
y = y + 1L
y[y > length(cols)] = 0L
y
#[1] 1 4 5 5 5 4 6 2 5 0
并检索最后一系列中第一个的位置:
{{1}}