使用基于R中另一列的值的二进制变量填充新列

时间:2014-05-28 19:54:41

标签: r loops

我是R的新手和编码,我需要一些帮助来连接R中的两个进程。  我有一个数据框:

X <- c(385, 386, 387, 388, 390, 391, 392, 393, 394, 395, 396, 398, 399, 400)

east<- seq(1,14,1)

north<- seq(1,14,1)

df2 <-data.frame(X,east,north)

我想要做的是逐行查看X中的值并将它们相互比较以使用二进制结果填充新列。例如,如果X [1,]和X [2,]是连续的,则新列值为1,如果X [1,]和X [2,]不是连续的0。 这段代码:

for(i in 1:nrow(df2)){
ifelse((df2$X[i+1]-df2$X[i] <= 1), print(1), print(0))
}

提供了我想要的信息,但我很难将其纳入专栏。

[1] 1
[1] 1
[1] 1
[1] 0
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 0
[1] 1
[1] 1 

我也试过这个:

df2$response <- NA
for(i in 1:nrow(df2)){
if(df2$X[i+1]-df2$X[i]==1){df2$response[i]<-1} else
if(df2$X[i+1]-df2$X[i]>1){df2$response[i]<-0}
}

但收到此错误:

Error in if (df2$X[i + 1] - df2$X[i] == 1) { : 
 missing value where TRUE/FALSE needed

有什么建议吗?提示?谢谢!

4 个答案:

答案 0 :(得分:4)

人们正在与神秘的解决方案捆绑在一起。只是:

df2$response <- c( head( df2$X, -1) - tail(df2$X, -1) <= 1, NA_integer_)

OR:

df2$response <-  c( diff(df2$X) <= 1, NA_integer_ )    

需要NA来解释在最后一行没有什么可以减去的事实。使用NA_integer_作为占位符而不是NA会导致逻辑值强制转换为整数(默认情况下,NA是逻辑类型)。

答案 1 :(得分:2)

要整理它,data.table解决方案(仅用于说明)

library(data.table)
setDT(df2)[, flag := c(diff(X) <= 1, NaN)]

答案 2 :(得分:1)

使用dplyr的另一个选项:

 require(dplyr)

 df2 %>% mutate( flag = ifelse( lead(X)-X==1, 1, 0 ) )

但是ifelse()不能很好地扩展/可能很慢,所以我们可以这样做:

 df2 %>% mutate( flag = as.integer( lead(X)-X==1 ) )

需要as_integer()来准确指定您在分别将TRUEFALSE转换为10时提出的输出

#      X flag
# 1  385    1
# 2  386    1
# 3  387    1
# 4  388    0
# 5  390    1
# 6  391    1
# 7  392    1
# 8  393    1
# 9  394    1
# 10 395    1
# 11 396    0
# 12 398    1
# 13 399    1
# 14 400   NA

答案 3 :(得分:-1)

你快到了。

df2$flag <- ifelse(c(diff(df2$X), 1) <= 1, 1, 0)