使用dplyr或data.table根据特定条件逐行汇总数据帧
我在下面有一个示例data.frame。原始数据集大约有一百万行和25列。我有一个带有for循环的解决方案,但它太慢了。所以我想知道有没有一种方法可以实现我想用dplyr或data.table做的事情 示例data.frame:使用dplyr或data.table根据特定条件逐行汇总数据帧,r,dplyr,data.table,R,Dplyr,Data.table,我在下面有一个示例data.frame。原始数据集大约有一百万行和25列。我有一个带有for循环的解决方案,但它太慢了。所以我想知道有没有一种方法可以实现我想用dplyr或data.table做的事情 示例data.frame: outcome leg arm head 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 1 0 0
outcome leg arm head
1 0 1 0
1 1 0 1
1 0 1 1
0 1 0 0
0 0 1 0
0 0 1 1
1 1 0 0
0 1 0 1
1 0 0 0
0 0 0 0
0 1 0 0
1 0 1 0
0 1 0 0
0 0 0 1
1 1 1 0
0 1 1 0
每一行都是一个动作。结果一栏是该行动是否成功。而另一列则是这个动作是用腿、手臂还是用头
我需要的是另一个专栏,它给我提供了该类型行动中所有成功行动的百分比。例如,第一行是手臂的成功动作。因此,计算整个数据集中仅使用手臂的所有操作,并给我成功的百分比。然后在同一行的新列中输入新的%成功值。因此,数据集中共有3个带有arm的操作(行),2个操作成功(结果=1),因此同一行上的新值为0.666。我们的新行将如下所示:
outcome leg arm head successful
1 0 1 0 0.666
然后我们将移动到第二行,这是一个腿(腿=1)和头(头=1)的动作,因此我们计算数据集中腿和头的所有动作,并获得成功动作的百分比
有没有办法通过data.table或dplyr为整个数据集实现这一点?我想data.table会更快吗?您可以使用
数据。table
通过:
DT[, sum(outcome)/.N, by = .(leg, arm, head)]
# leg arm head V1
# 1: 0 1 0 0.6666667
# 2: 1 0 1 0.5000000
# 3: 0 1 1 0.5000000
# 4: 1 0 0 0.2500000
# 5: 0 0 0 0.5000000
# 6: 0 0 1 0.0000000
# 7: 1 1 0 0.5000000
DT %>% group_by(leg, arm, head) %>% summarize(successful = sum(outcome)/n())
# # A tibble: 7 x 4
# # Groups: leg, arm [?]
# leg arm head successful
# <int> <int> <int> <dbl>
# 1 0 0 0 0.500
# 2 0 0 1 0.
# 3 0 1 0 0.667
# 4 0 1 1 0.500
# 5 1 0 0 0.250
# 6 1 0 1 0.500
# 7 1 1 0 0.500
或dplyr
by:
DT[, sum(outcome)/.N, by = .(leg, arm, head)]
# leg arm head V1
# 1: 0 1 0 0.6666667
# 2: 1 0 1 0.5000000
# 3: 0 1 1 0.5000000
# 4: 1 0 0 0.2500000
# 5: 0 0 0 0.5000000
# 6: 0 0 1 0.0000000
# 7: 1 1 0 0.5000000
DT %>% group_by(leg, arm, head) %>% summarize(successful = sum(outcome)/n())
# # A tibble: 7 x 4
# # Groups: leg, arm [?]
# leg arm head successful
# <int> <int> <int> <dbl>
# 1 0 0 0 0.500
# 2 0 0 1 0.
# 3 0 1 0 0.667
# 4 0 1 1 0.500
# 5 1 0 0 0.250
# 6 1 0 1 0.500
# 7 1 1 0 0.500
DT%>%分组依据(腿部、手臂、头部)%>%总结(成功=总结(结果)/n()
##tibble:7 x 4
##组:腿、手臂[?]
#腿-臂-头成功
#
# 1 0 0 0 0.500
# 2 0 0 1 0.
# 3 0 1 0 0.667
# 4 0 1 1 0.500
# 5 1 0 0 0.250
# 6 1 0 1 0.500
# 7 1 1 0 0.500
您可以使用数据进行操作。表
通过:
DT[, sum(outcome)/.N, by = .(leg, arm, head)]
# leg arm head V1
# 1: 0 1 0 0.6666667
# 2: 1 0 1 0.5000000
# 3: 0 1 1 0.5000000
# 4: 1 0 0 0.2500000
# 5: 0 0 0 0.5000000
# 6: 0 0 1 0.0000000
# 7: 1 1 0 0.5000000
DT %>% group_by(leg, arm, head) %>% summarize(successful = sum(outcome)/n())
# # A tibble: 7 x 4
# # Groups: leg, arm [?]
# leg arm head successful
# <int> <int> <int> <dbl>
# 1 0 0 0 0.500
# 2 0 0 1 0.
# 3 0 1 0 0.667
# 4 0 1 1 0.500
# 5 1 0 0 0.250
# 6 1 0 1 0.500
# 7 1 1 0 0.500
或dplyr
by:
DT[, sum(outcome)/.N, by = .(leg, arm, head)]
# leg arm head V1
# 1: 0 1 0 0.6666667
# 2: 1 0 1 0.5000000
# 3: 0 1 1 0.5000000
# 4: 1 0 0 0.2500000
# 5: 0 0 0 0.5000000
# 6: 0 0 1 0.0000000
# 7: 1 1 0 0.5000000
DT %>% group_by(leg, arm, head) %>% summarize(successful = sum(outcome)/n())
# # A tibble: 7 x 4
# # Groups: leg, arm [?]
# leg arm head successful
# <int> <int> <int> <dbl>
# 1 0 0 0 0.500
# 2 0 0 1 0.
# 3 0 1 0 0.667
# 4 0 1 1 0.500
# 5 1 0 0 0.250
# 6 1 0 1 0.500
# 7 1 1 0 0.500
DT%>%分组依据(腿部、手臂、头部)%>%总结(成功=总结(结果)/n()
##tibble:7 x 4
##组:腿、手臂[?]
#腿-臂-头成功
#
# 1 0 0 0 0.500
# 2 0 0 1 0.
# 3 0 1 0 0.667
# 4 0 1 1 0.500
# 5 1 0 0 0.250
# 6 1 0 1 0.500
# 7 1 1 0 0.500
以下是如何使用dplyr
df %>%
group_by(arm, head, leg) %>%
summarize_at(vars(outcome), funs(successful = mean)) %>%
left_join(df, .)
最后一行将摘要合并到原始数据集中。我不知道这是否是你想要的,所以如果不是,就跳过最后一行 以下是如何使用dplyr
df %>%
group_by(arm, head, leg) %>%
summarize_at(vars(outcome), funs(successful = mean)) %>%
left_join(df, .)
最后一行将摘要合并到原始数据集中。我不知道这是否是你想要的,所以如果不是,就跳过最后一行 使用dplyr
:
data<-group_by_at(data, .vars=2:4) %>% mutate(successful=sum(outcome)/n())
data%变异(成功=总和(结果)/n()
.vars
可以替换为列所在的任何位置,因此,如果要包含的列超过20列,则该选项非常有用。使用dplyr
:
data<-group_by_at(data, .vars=2:4) %>% mutate(successful=sum(outcome)/n())
data%变异(成功=总和(结果)/n()
.vars
可以替换为列所在的任何位置,因此,如果要包含的列超过20列,则它非常有用