我是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
有什么建议吗?提示?谢谢!
答案 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()
来准确指定您在分别将TRUE
和FALSE
转换为1
和0
时提出的输出
# 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)