使用dplyr或data.table根据特定条件逐行汇总数据帧

使用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

我在下面有一个示例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    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列,则它非常有用