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