将数据框中的组除以单独组的中位数

斯科特·沃沙尔

我有一个包含一列group_IDclass,多个数字功能以及一些字符元数据的数据框,即:

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

我想计算foo每个类别的中位数group_ID,然后将每行除以与匹配的中位数group_ID

在此示例中,每行只有1行foo,因此中位数将与初始值相同,但实际上,每行class都有许多行group_ID


有没有简单的方法可以做到这一点?到目前为止,我最大的尝试是为中位数创建一个单独的数据foo框,然后按group_ID拆分并在一个可怕的循环中进行扫描,但最终我丢失了元数据列。这似乎是很常规的事情,所以我确定我丢失了一些东西。

任何帮助,将不胜感激。

蜡烛和橙色

我们可以用mutate_eachfromdplyr来除以条件。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章