您如何在用户 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
考虑 ifelse
和 ave
,遍历 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
也许我正在使用一种简单的方法。使用 dplyr
和 tidyr
:
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
我正在尝试创建一个虚拟变量来标记参加特定活动的人的用户 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
考虑 ifelse
和 ave
,遍历 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
也许我正在使用一种简单的方法。使用 dplyr
和 tidyr
:
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