我有一个包含一列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
我想计算foo
每个类别的中位数group_ID
,然后将每行除以与匹配的中位数group_ID
。
在此示例中,每行只有1行foo
,因此中位数将与初始值相同,但实际上,每行class
和都有许多行group_ID
。
有没有简单的方法可以做到这一点?到目前为止,我最大的尝试是为中位数创建一个单独的数据foo
框,然后按group_ID拆分并在一个可怕的循环中进行扫描,但最终我丢失了元数据列。这似乎是很常规的事情,所以我确定我丢失了一些东西。
任何帮助,将不胜感激。
我们可以用mutate_each
fromdplyr
来除以条件。
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] 删除。
我来说两句