r语言 - 使用 dplyr 或 data.table 根据特定条件逐行汇总数据框



我在下面有一个示例data.frame。原始数据集大约有 100 万行和 25 列。我有一个带有 for 循环的解决方案,但它太慢了。所以我想知道有没有办法用dplyr或data.table做我想做的事情?

示例数据帧:

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 个带有手臂的操作(行(,其中 2 个成功 (result=1(,因此同一行上的新值将为 0.666。我们的新行如下所示:

outcome leg arm head successful
1     0   1   0      0.666

然后,我们将移动到第二行,这是腿(腿=1(和头(头=1(的动作,所以我们计算数据集中所有腿和头的动作,并获得成功的百分比。

有没有办法使用 data.table 或 dplyr 为整个数据集实现这一点?我认为数据表会更快吗?

你可以通过以下方式用data.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

或通过以下方式dplyr

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

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())

.vars可以替换为列所在的任何位置,因此如果要包含>20 列,这将非常有用。

最新更新