繁体   English   中英

用R编程中的条件循环

[英]Loop with conditions in R programming

我想比较前一行的值是否与当前行的值相同(对于多个变量,还使用值列表)。 在这种情况下,如何执行编写代码。 我阅读了“应用”功能,可以使用。

在发布此问题之前,我在这里搜索了此主题,发现该问题有些相似,但找不到确切的问题。 我对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)

  1. 变量2应该是以下4个名称之一(aa,bb,cc,dd)
  2. 变量1应与上一行不同
  3. 机票编号必须与上一行相同

先谢谢您的帮助 !

没有循环的方法:

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

数据

df <- structure(list(Ticket.No = c("Tkt10256", "Tkt10257", "Tkt10257", 
"Tkt10257", "Tkt10260", "Tkt10260", "Tkt10262"), V1 = c(1L, 1L, 
2L, 3L, 1L, 2L, 3L), V2 = c("X", "aa", "bb", "x", "cc", "aa", 
"bb"), Flag = c(0L, 0L, 1L, 1L, 0L, 1L, 0L)), .Names = c("Ticket.No", 
"V1", "V2", "Flag"), class = "data.frame", row.names = c(NA, 
-7L))

多一个:

在更大的数据上进行检查。 我不确定是否可以在其中使用duplicated功能。 如果TicketNo列中的数字增加(即TktXXXXX中的X),则应该可以正常工作。

> 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

尝试:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM