根据其他列但不同行中的值计算第三列中的值

时间:2019-10-11 05:41:46

标签: r if-statement

很抱歉,如果这是一个琐碎的问题或没有道理,这是我的第一篇文章。我来自Excel,我曾使用过if语句和索引匹配函数,并且正在尝试在R中执行类似的操作以从两列中提取数据,但不一定要在同一行中获取数据以在第三列中获取值,我的示例这是

df<-data.frame(ID=c(1,5,4,2,3),A=c(1,0,1,1,1),B=c(0,0,1,0,0))

期望的输出:df <-data.frame(ID = c(1,5,4,2,3),A = c(1,0,1,1,1),B = c(0,0 ,1,0,0),C = c(0,0,0,0,1))

我要创建的第三列“ C”基本上遵循以下格式:

Ifelse(A[ID]=1 & B[ID+1]=1 , C[ID]=1 , C[ID]=0)

基本上,如果A=1“ x”中的IDB=1“ x + 1”中的ID,则在ID为“ x”的新列C中为= 1 = 0。如果可以简化事情,我可以按ID排序,但是最好通过ID列来完成。

到目前为止,我已经尝试过ifelse语句,但我想可能会有更好的方法

2 个答案:

答案 0 :(得分:0)

使用dplyr,我们可以使用lead通过ID整理数据后获取下一个元素。

library(dplyr)
df %>%
  arrange(ID) %>%
  mutate(C = as.integer(A == 1 & lead(B) == 1))

#  ID A B C
#1  1 1 0 0
#2  2 1 0 0
#3  3 1 0 1
#4  4 1 1 0
#5  5 0 0 0

在基数R中,我们可以做

df1 <- df[order(df$ID),]
df1$C <- with(df1, c(A[-nrow(df)] == 1 & tail(B, -1) == 1, 0))

不安排数据,我们可能可以做

transform(df, C = as.integer(A[ID] == 1 & B[match(ID + 1, ID)] == 1))

答案 1 :(得分:0)

使用Lead函数可以使它工作

df <-df [order(df $ ID),]

df $ C <-ifelse(df $ A == 1&Lead(df $ B)== 1,1,0)