R 分组数据并跳转到下一个案例
我有这样一个数据帧(df1t):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
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。我不知道我对期望行为的假设是否正确。我认为这是一个非常好的方法,我只是想解释为什么我仍然觉得有必要扩展它。很抱歉,我的评论也不够清晰。