【问题标题】:built a new column, based on different conditions on three consecutives rows in r [duplicate]根据r中三个连续行的不同条件构建了一个新列[重复]
【发布时间】:2020-08-26 11:53:24
【问题描述】:

是否可以基于 3 个连续行构建一个新列,但每行的条件不同(滞后、行、领先)? 我已经尝试了几种方法,请参见下面的代码。但没有运气。

数据

alas<-c("9","2","9","8","1","8","1","1","1")
piedras<-paste("group_", letters[1:9], sep="")
data<-data.frame(alas,piedras)
data$alas<-as.numeric(as.character(as.factor(data$alas)))

预期结果

data$result<-c("0","1","7","4","1","2","5","0","0")

loop1:不工作

 num<-"0"
 for (i in 1:nrow(data)){
 if(data$alas[i] %in% lead(data$alas)[i] & data$alas[i] %in% lag(data$alas)[i]){num="0"}
 else if (lag(data$alas)[i]>7 & data$alas[i]<3 & lead(data$alas)[i]>7){num[i]="1"}
 else if (lag(data$alas)[i]>7 & data$alas[i]<3 & lead(data$alas)[i]<3){num[i]="5"}
 else if (lag(data$alas)[i]>7 & data$alas[i]>7 & lead(data$alas)[i]<3){num[i]="4"}
 else if (lag(data$alas)[i]<3 & data$alas[i]>7 & lead(data$alas)[i]<3){num[i]="2"}
 else if (lag(data$alas)[i]<3 & data$alas[i]>7 & lead(data$alas)[i]<3){num[i]="7"}
 else if (lag(data$alas)[i]<3 & data$alas[i]<3 & lead(data$alas)[i]>7){num[i]="6"}
 else{num[i]="new"}}

不行,给下一条消息:

 >Error in if (lag(data$alas)[i] > 7 & data$alas[i] > 7 & lead(data$alas)[i] <  : 

需要 TRUE/FALSE 的地方缺少值

带矢量

for (i in 1:nrow(data)){
if(data$alas[i] %in% (data$alas)[i-1] & data$alas[i] %in% (data$alas)[i+1]){num="0"}
else if ((data$alas)[i-1]>7 & data$alas[i]<3 & (data$alas)[i+1]>7){num[i]="1"}
else if ((data$alas)[i-1]>7 & data$alas[i]<3 & (data$alas)[i+1]<3){num[i]="5"}
else if ((data$alas)[i-1]>7 & data$alas[i]>7 & (data$alas)[i+1]<3){num[i]="4"}
else if ((data$alas)[i-1]<3 & data$alas[i]>7 & (data$alas)[i+1]<3){num[i]="2"}
else if ((data$alas)[i-1]<3 & data$alas[i]>7 & (data$alas)[i+1]<3){num[i]="7"}
else if ((data$alas)[i-1]<3 & data$alas[i]<3 & (data$alas)[i+1]>7){num[i]="6"}
else{num[i]="new"}}

不行,给我下一条消息:

 >Error in if ((data$alas)[i - 1] > 7 & data$alas[i] < 3 & (data$alas)[i +  : 
  argument is of length zero

没有矢量

for (j in 1:nrow(data)){
if(data$alas[i] %in% (data$alas)[i-1] & data$alas[i] %in% (data$alas)[i+1]){num="0"}
else if ((data$alas)[i-1]>7 & data$alas[i]<3 & (data$alas)[i+1]>7){data$num[i]="1"}
else if ((data$alas)[i-1]>7 & data$alas[i]<3 & (data$alas)[i+1]<3){data$num[i]="5"}
else if ((data$alas)[i-1]>7 & data$alas[i]>7 & (data$alas)[i+1]<3){data$num[i]="4"}
else if ((data$alas)[i-1]<3 & data$alas[i]>7 & (data$alas)[i+1]<3){data$num[i]="2"}
else if ((data$alas)[i-1]<3 & data$alas[i]>7 & (data$alas)[i+1]<3){data$num[i]="7"}
else if ((data$alas)[i-1]<3 & data$alas[i]<3 & (data$alas)[i+1]>7){data$num[i]="6"}
else{num[i]="new"}}

它不起作用: > if ((data$alas)[i - 1] > 7 & data$alas[i]

nrow(data)
length(num)
data$num<-num

有什么建议吗?

【问题讨论】:

  • 预期结果背后的逻辑究竟是什么?
  • 我很难理解您尝试做的事情背后的逻辑。更好的描述可能会帮助您获得更多有用的答案

标签: r lag lead


【解决方案1】:

如果不涉及逻辑并且您必须单独指定每个条件,您可以尝试case_when,这样可以轻松应用多个条件。

library(dplyr)

data %>%
  mutate(result = case_when(alas == lead(alas) & alas == lag(alas) ~ 0,
                            lag(alas) > 7 & alas < 3 & lead(alas) > 7 ~ 1,
                            lag(alas) > 7 & alas < 3 & lead(alas) < 3~ 5,
                            lag(alas) > 7 & alas > 7 & lead(alas) < 3~ 4,
                            lag(alas) < 3 & alas > 7 & lead(alas) < 3~ 2, 
                            lag(alas) < 3 & alas > 7 & lead(alas) < 3~ 7, 
                            lag(alas) < 3 & alas < 3 & lead(alas) > 7~ 6))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    相关资源
    最近更新 更多