Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R规划中带条件的循环_R_Loops_Conditional Statements_Apply - Fatal编程技术网

R规划中带条件的循环

R规划中带条件的循环,r,loops,conditional-statements,apply,R,Loops,Conditional Statements,Apply,我想比较上一行的值是否与多个变量的当前值相同,并使用值列表。在这种情况下,如何执行写代码。我知道可以使用“应用”函数 在发布这个问题之前,我在这里搜索了这个主题,发现有点类似,但找不到确切的问题。我对R很陌生 这是我的示例表:需要根据条件进行标记 Ticket No V1 V2 Flag Tkt10256 1 X 0 Tkt10257 1 aa 0 Tkt10257 2 bb 1 Tkt10257 3 x 0 Tkt10260 1

我想比较上一行的值是否与多个变量的当前值相同,并使用值列表。在这种情况下,如何执行写代码。我知道可以使用“应用”函数

在发布这个问题之前,我在这里搜索了这个主题,发现有点类似,但找不到确切的问题。我对R很陌生

这是我的示例表:需要根据条件进行标记

Ticket No   V1  V2  Flag
Tkt10256    1   X   0
Tkt10257    1   aa  0
Tkt10257    2   bb  1
Tkt10257    3   x   0
Tkt10260    1   cc  0
Tkt10260    2   aa  1
Tkt10262    3   bb  0
我必须根据以下条件进行标记,如果满足所有条件,则标记为1

变量2应该是四个名称aa、bb、cc、dd中的一个 变量1应与前一行不同 票号必须与前一行相同 提前感谢您的帮助

试试看:

for(i in 2:nrow(ddf)){
   ddf$Flag[i] = ifelse(  ddf$V2[i] %in% c('aa', 'bb', 'cc', 'dd') 
           && ddf$V1[i] != ddf$V1[(i-1)] 
           &&  ddf$TicketNo[i] == ddf$TicketNo[(i-1)]
         ,1,0)
 }
ddf
  TicketNo V1 V2 Flag
1 Tkt10256  1  X    0
2 Tkt10257  1 aa    0
3 Tkt10257  2 bb    1
4 Tkt10257  3  x    0
5 Tkt10260  1 cc    0
6 Tkt10260  2 aa    1
7 Tkt10262  3 bb    0

没有循环的方法:

indx1 <- with(df, V2 %in% paste0(letters[1:4], letters[1:4]) )
indx2 <- with(df, c(TRUE,V1[-1]!=V1[-length(V1)]))
indx3 <- with(df, c(FALSE,Ticket.No[-1]==Ticket.No[-nrow(df)]))

df$Flag <- (indx1 & indx2 & indx3)+0
df$Flag
#[1] 0 0 1 0 0 1 0
数据 还有一点:

在你的大数据上检查这个。我不确定duplicated是否是正确的函数。如果TicketNo列中的数字在增加,即txtxxxxx中的Xs,那么它应该可以正常工作

> dat2 <- dat[dat$V2 %in% c("aa", "bb", "cc", "dd"),]
> rn <- rownames(dat2)[duplicated(dat2[[1]]) & !c(FALSE, diff(dat2[[2]]) == 0)]
> dat$Flag <- (rownames(dat) %in% rn)+0
> dat
#   TicketNo V1 V2 Flag
# 1 Tkt10256  1  X    0
# 2 Tkt10257  1 aa    0
# 3 Tkt10257  2 bb    1
# 4 Tkt10257  3  x    0
# 5 Tkt10260  1 cc    0
# 6 Tkt10260  2 aa    1
# 7 Tkt10262  3 bb    0

@Akrun答案的一个变体:

with(df, 
  V2 %in% c("aa","bb","cc","dd") &  
  c(FALSE,diff(V1) != 0) &
  c(FALSE,head(Ticket.No, -1)) == Ticket.No
) + 0

#[1] 0 0 1 0 0 1 0

第3行和第4行上的V1不相同,但您将其标记为相同。在第4行,V2中有x,并且还标记了它。根据您的条件,这些值不应为1。请更正这一点,我很抱歉这里的混乱,Richard。条件2是v1应该与前一行不同。很好。“我正在考虑在“内部”中使用“如果”和“其他内部”。@Richard Scriven谢谢。是的,这是一个选择它工作得很好Akrun,非常感谢!我也在尝试使用循环或应用函数,因为这对我来说是一个很好的学习。@Mathan对于更大的数据集,循环可能会很慢。我会使用矢量化选项。我想rnso已经给了你一个使用for循环的选项
with(df, 
  V2 %in% c("aa","bb","cc","dd") &  
  c(FALSE,diff(V1) != 0) &
  c(FALSE,head(Ticket.No, -1)) == Ticket.No
) + 0

#[1] 0 0 1 0 0 1 0