您如何在用户 ID # 中应用 if else 语句?

How do you apply if else statements across user id #?

我正在尝试创建一个虚拟变量来标记参加特定活动的人的用户 ID。每个用户 ID 都有多行,我希望这个虚拟变量应用于标记用户 ID 的每一行。例如,使用下面的数据集,我想标记参加“事件 b”的每个人的用户 ID(使用“1”表示参加事件 b,“0”表示未参加事件 b)。棘手的部分是我希望 1 出现在与参加“事件 b”的人的用户 ID 相匹配的每一行中。

我想使用这个虚拟变量最终对数据进行子集化,以便我可以评估参加特定活动的用户的活动参加模式。

df<-data.frame(id=(100,100,100,101,101,102,102,103,103,103,103),
             event=("a","b","c","b","d","a","c","a","c","d","e"))

据我了解,您想要一次性编码。 您可以将以下代码与 caret 包的 dummyVars 函数一起使用。之后,您使用相应的 dplyr 函数聚合重复行。

library(caret)
library(dplyr)

df<-data.frame(id=c(100,100,100,101,101,102,102,103,103,103,103),
               event=c("a","b","c","b","d","a","c","a","c","d","e"))



dmy <- dummyVars(" ~ .", data = df)
trsf <- data.frame(predict(dmy, newdata = df))
aggregate(.~id, trsf, FUN=sum)

   id event.a event.b event.c event.d event.e
1 100       1       1       1       0       0
2 101       0       1       0       1       0
3 102       1       0       1       0       0
4 103       1       0       1       1       1

考虑 ifelseave,遍历 unique 值或 levels 事件

for(ev in unique(df$event)) {   # for(ev in levels(df$event)) {
    df[[paste0("event_", ev, "_flag")]] <- with(df, ave(ifelse(event == ev, 1, 0), id, FUN=max))
}

df
#     id event event_a_flag event_b_flag event_c_flag event_d_flag event_e_flag
# 1  100     a            1            1            1            0            0
# 2  100     b            1            1            1            0            0
# 3  100     c            1            1            1            0            0
# 4  101     b            0            1            0            1            0
# 5  101     d            0            1            0            1            0
# 6  102     a            1            0            1            0            0
# 7  102     c            1            0            1            0            0
# 8  103     a            1            0            1            1            1
# 9  103     c            1            0            1            1            1
# 10 103     d            1            0            1            1            1
# 11 103     e            1            0            1            1            1

也许我正在使用一种简单的方法。使用 dplyrtidyr:

df %>% 
  mutate(value=1) %>%
  pivot_wider(names_from="event", values_fill=0)

returns

# A tibble: 4 x 6
     id     a     b     c     d     e
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1   100     1     1     1     0     0
2   101     0     1     0     1     0
3   102     1     0     1     0     0
4   103     1     0     1     1     1