首页 文章

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

提问于
浏览
2

我是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 回答

  • -1

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

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

    要么:

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

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

  • 2

    使用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
    
  • 1

    你快到了 .

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

    把它包起来, data.table 解决方案(仅用于说明)

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

相关问题