gpt4 book ai didi

r - 按单独组的中位数划分数据框中的组

转载 作者:行者123 更新时间:2023-12-04 10:37:51 25 4
gpt4 key购买 nike

我有一个包含列 group_ID 的数据框和 class , 和多个数字特征,以及一些字符元数据,即:

group_ID  class  var1  var2  var3  metadata
a foo 1 324 3 cat
a bar 1.3 34 53 dog
a baz 31 34 5 elephant
b foo 34 34 943 dolphin
b bar 94 51 23 chipmunk
b baz 985 595 43 badger
c foo 43 93 23 tapir
c bar 43 23 23 monkey
c baz 40 53 512 duck

我想计算类(class)的中位数 foo每个 group_ID ,然后将每一行除以与 group_ID 匹配的中位数.

在这个例子中,每个 foo 只有 1 行,所以中位数将与初始值相同,但实际上我每个 class 都有很多行和 group_ID .

有没有一种简单的方法可以做到这一点?我迄今为止最好的尝试包括为 foo 的中值创建一个单独的数据框。 ,然后按 group_ID 拆分并扫入一个可怕的循环,但我最终丢失了元数据列。这似乎是一件很平常的事情,所以我确定我错过了一些东西。

任何帮助,将不胜感激。

最佳答案

我们可以使用 mutate_each来自 dplyr按条件划分。

library(dplyr)
df %>% group_by(group_ID) %>%
mutate_each(funs(./median(.[class == "foo"])), var1:var3)
# Source: local data frame [9 x 6]
# Groups: group_ID
#
# group_ID class var1 var2 var3 metadata
# 1 a foo 1.0000000 1.0000000 1.00000000 cat
# 2 a bar 1.3000000 0.1049383 17.66666667 dog
# 3 a baz 31.0000000 0.1049383 1.66666667 elephant
# 4 b foo 1.0000000 1.0000000 1.00000000 dolphin
# 5 b bar 2.7647059 1.5000000 0.02439024 chipmunk
# 6 b baz 28.9705882 17.5000000 0.04559915 badger
# 7 c foo 1.0000000 1.0000000 1.00000000 tapir
# 8 c bar 1.0000000 0.2473118 1.00000000 monkey
# 9 c baz 0.9302326 0.5698925 22.26086957 duck

以防万一 OP 想要将这些添加为新/附加列并保持以前的数据不变,您可以将上述方法修改为:
df %>% 
group_by(group_ID) %>%
mutate_each(funs(./median(.[class == "foo"])), setNames(var1:var3, paste0("varN", 1:3)))

关于r - 按单独组的中位数划分数据框中的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35723568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com