根据条件

时间:2016-05-06 06:57:13

标签: r dataframe

我有一个名为df的数据框。

数据框中有四列:

  • 更改:表示是否为新用户(如果是,则为1)
  • 创建:表示用户是否 请求访问(如果为真,则为1)
  • 删除:表示用户是否请求删除其ID(如果为真,则为1)

  • final:表示我们是否需要向用户收费(如果当天请求访问,则为1)

' final'的逻辑柱:

如果'创建'是1,那么' final'是1,这重复直到删除'为1时,当用户发生变化时,该值会重置(成为'创建'中的任何内容)(当'更改'为1时)

没有可能创造'并且'删除'两者都是1,我们在第二天处理删除请求。

就excel公式而言,它是这样的:

公式:

假设标题从A1开始

=IF(A2=1,B2,IF(B2=1,1,IF(C3=1,0,D2)))

就R来说,这是我到目前为止所使用的:

使用mutate

df <- mutate(df, final =  ifelse(change == 1, create,
                          ifelse(create == 1, 1,
                          ifelse(delete == 1, 0, lag(final)))))

仅使用ifelse

df$final <- ifelse(df$change == 1, df$create,
            ifelse(df$create == 1, 1,
            ifelse(df$delete == 1, 0, lag(df$final))))

但以下内容正常:

for (i in 1:NROW(df)){

  df$final[i] <- ifelse(df$chnaged[i] == 1, df$create[i],
                 ifelse(df$create[i] == 1, 1,
                 ifelse(df$delete[i] == 1, 0, df$final[i-1])))

}

预期输出:(仅在使用循环代码时才获得)

change  create  delete  final
0       0       0       0
1       0       0       0
1       1       0       1
1       0       0       1
1       0       0       1
1       0       0       1
1       0       0       1
1       0       0       1
1       0       1       0
1       0       0       0
1       0       0       0
1       0       0       0
1       1       0       1
1       0       1       0

实际输出:

change  create  delete  final
0       0       0       0
1       0       0       0
1       1       0       1
1       0       0       1
1       0       0       1
1       0       0       1
1       0       0       1
1       0       0       0
1       0       1       0
1       0       0       0
1       0       0       0
1       0       0       0
1       1       0       1
1       0       1       0

我无法弄清楚为什么会这样,疯狂的事情是excel实施工作正常,它只在R中我面临这个问题

:OSX el队长的R 3.30

实际数据样本

dput(df)
structure(list(username = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L), .Label = c("admin", "user1", "user96"), class = "factor"), 
    create = c(0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
    ), delete = c(0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L)), .Names = c("username", "create", "delete"), class = "data.frame", row.names = c(NA, 
-87L))

1 个答案:

答案 0 :(得分:0)

尝试data.table

library(data.table)
setDT(df)
df[, final := ifelse(change == 1, create, ifelse(create == 1, 1, ifelse(delete == 1, 0, lag(final))))]
相关问题