计算R中下一个值的数字条件

时间:2017-04-08 18:24:10

标签: r

数据框包含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;。

此外,代码越快越好。

2 个答案:

答案 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}}