根据R中其他列的条件创建一个新列

时间:2019-08-28 19:46:28

标签: r

我有以下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

1 个答案:

答案 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有助于获得不重复的唯一值序列,然后按照出现的顺序将它们粘贴在一起。