R 分组数据并跳转到下一个案例

R 分组数据并跳转到下一个案例,r,dataframe,dplyr,data-cleaning,R,Dataframe,Dplyr,Data Cleaning,我有这样一个数据帧(df1t): userid | interaction | goal 0001 | Access1 | 0 0001 | Access2 | 1 0001 | Access3 | 0 0002 | Access1 | 1 0003 | Access2 | 0 userid | path | goal 0001 | Access1 > Access2 | 1 000

我有这样一个数据帧(df1t):

userid | interaction | goal
0001   | Access1     |  0
0001   | Access2     |  1
0001   | Access3     |  0
0002   | Access1     |  1
0003   | Access2     |  0
userid | path               | goal
0001   | Access1 > Access2  |  1
0002   | Access1            |  1
0003   | Access2            |  0
对于我正在使用的分组数据:

library(dplyr)
usrlvl <- df1t %>% 
group_by(userid) %>% 
summarise(path = paste(interaction, collapse = " > "),
      goal = sum(goal)
)
但是我对这个结果有一些问题。我的道路应该停在目标上,忽略其他人的互动。结果似乎是这样的:

userid | interaction | goal
0001   | Access1     |  0
0001   | Access2     |  1
0001   | Access3     |  0
0002   | Access1     |  1
0003   | Access2     |  0
userid | path               | goal
0001   | Access1 > Access2  |  1
0002   | Access1            |  1
0003   | Access2            |  0

有人遇到了这样的问题?

单程使用
dplyr

usrlvl <- df1t %>% 
  group_by(userid) %>% 
  filter(!(goal==0 & cumsum(goal)==1))%>%
  summarise(path = paste(interaction, collapse = " > "),
            goal = sum(goal))
# A tibble: 3 x 3
  userid              path  goal
   <dbl>             <chr> <dbl>
1      1 access1 > access2     1
2      2           access1     1
3      3           access2     0
usrlvl%
分组人(用户ID)%>%
筛选器(!(目标==0和累积数(目标==1))%>%
总结(路径=粘贴(交互,折叠=“>”),
目标=总和(目标))
#一个tibble:3x3
用户标识路径目标
1访问1>访问2 1
2 2访问1
3 3访问2 0

在目标从1变为0之前,您可以使用
which.max
在最后一个目标处停止

usrlvl <- df1t %>% 
  group_by(userid) %>% 
  summarise(path = paste(interaction[1:which.max(goal)], collapse = " > "),
            goal = sum(goal)
  )
#A tibble: 3 × 3
#  userid              path  goal
#   <int>             <chr> <int>
#1      1 Access1 > Access2     1
#2      2           Access1     1
#3      3           Access2     0
usrlvl%
分组人(用户ID)%>%
总结(path=paste(交互[1:which.max(目标)],collapse=“>”,
目标=总和(目标)
)
#一个tibble:3×3
#用户标识路径目标
#                 
#1访问1>访问2 1
#2 2访问1
#3 3访问2 0

一个选项是编写一个函数来捕获目标状态,并写出该状态的路径。使代码更简洁,特别是如果需要经常这样做(或使用不同类型的条件)

首先,定义函数:

untilGoal <- function(x, goal){
  if(sum(goal) >= 1){
    paste(x[1:(which(goal)[1])], collapse = " > ")
  } else
    paste(x, collapse = " > ")
}
给出:

  userid              path  goal
1      1 Access1 > Access2     1
2      2           Access1     1
3      3           Access2     0

为了确保我理解,如果目标从0变为1,那么路径将在目标=1的行停止?是的。当目标为1时,路径停止。我认为,如果在达到初始目标状态后有多个交互,那么这将失败。也就是说,如果您在userid 001中添加了“access 4”,那么它将包含在您的粘贴输出中。经过修改,希望它现在更加健壮?非常灵活的过滤方法。这个问题模棱两可,导致了这些问题。这应该是可行的,除非可以达到多个目标状态,并且OP希望将其记录在总和中。我假设ze只想要第一条路,但仍然想要达到的目标总数。然而,我不知道这是否是一个有效的假设。我认为,如果有一个以上的步骤没有达到目标,这将失败。例如,如果您为用户ID 3添加“Access3”,目标仍然为0@MarkPetersonOP中没有说明您建议的案例是否会发生,或者如果发生了该怎么办。OP需要澄清期望的行为。此方法适合给定的示例。我们真的无法二次猜测OP在他们甚至没有描述完全公平点@dww的情况下想要发生什么,这是OP。我不知道我对期望行为的假设是否正确。我认为这是一个非常好的方法,我只是想解释为什么我仍然觉得有必要扩展它。很抱歉,我的评论也不够清晰。