【发布时间】: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
有什么建议吗?
【问题讨论】:
-
预期结果背后的逻辑究竟是什么?
-
我很难理解您尝试做的事情背后的逻辑。更好的描述可能会帮助您获得更多有用的答案