我有以下3列的df。我想添加新列code
,该列基于其他两列对列action
进行了编码。
这是sudo代码如何生成code
列
for each user_id
for each session
if action V comes before P then Code column value is VP
if action P and no V then Code column value is P
if action P comes before V then Code column value is PV
df <- read.table(text="
user_id session action
1 1 P
1 1 N
1 2 V
1 2 P
1 2 V
2 1 N
2 1 V
2 1 V
2 1 P
2 2 P", header=T)
所以我的结果将是:
df
user_id session action Code
1 1 P P
1 1 N P
1 2 V VPV
1 2 P VPV
1 2 V VPV
2 1 N VP
2 1 V VP
2 1 V VP
2 1 P VP
2 2 P P
任何代码都不得超过VPV和PVP,因此我们不应具有VPVV或PVPV
答案 0 :(得分:3)
在这里我们可以编写一些辅助函数来获取代码
get_code <- function(x, keep=c("P","V"), max_len=3) {
as.character(x[x %in% keep]) %>%
{rle(.)$values} %>%
paste(collapse="") %>%
substr(1, max_len)
}
df %>%
group_by(user_id, session) %>%
mutate(code=get_code(action))]
# user_id session action code
# <int> <int> <fct> <chr>
# 1 1 1 P P
# 2 1 1 N P
# 3 1 2 V VPV
# 4 1 2 P VPV
# 5 1 2 V VPV
# 6 2 1 N VP
# 7 2 1 V VP
# 8 2 1 V VP
# 9 2 1 P VP
# 10 2 2 P P
rle
有助于获得不重复的唯一值序列,然后按照出现的顺序将它们粘贴在一起。