我有一个名为df的数据框。
数据框中有四列:
删除:表示用户是否请求删除其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))
答案 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))))]