问题描述
我想要做的是基于我们迭代的变量的独特元素执行一些聚合。
我能够执行需要手动编写的内容。但是,我想对此过程进行概括,以便可以自动执行。
library(tidyverse)
df <-
tibble(
LEVEL = c('1','1.1','1.2','1.1.1'),A = c(1,3,20,10),B = c(100,20),DEPTH = c(1,2,3)
)
df %>%
mutate(HEAD_VOLUME =
case_when(DEPTH == 1 ~ A / B,TRUE ~ 0)) %>%
mutate(HEAD_VOLUME =
case_when(DEPTH != 1 ~ nth(HEAD_VOLUME,1),TRUE ~ HEAD_VOLUME)) %>%
mutate(DEPTH_2_VOLUME =
case_when(DEPTH == 2 ~ A/ B,TRUE ~ 1)) %>%
mutate(DEPTH_3_VOLUME =
case_when(DEPTH == 3 ~ A/ B,TRUE ~ 1))
现在想象一下DEPTH的数量会更大,我需要函数来解决这个问题。
我正在考虑for循环,并迭代DEPTH的所有唯一值。但是,我们无法(至少不能在dplyr中)使用paste
函数创建新列。
我正在考虑类似(伪代码)的事情:
df %>%
mutate(HEAD_VOLUME =
case_when(DEPTH == 1 ~ A / B,TRUE ~ HEAD_VOLUME)) %>%
mutate(paste('DEPTH_',i,'VOLUME') = # At this line i shall be second element of iter
case_when(DEPTH == iter[i] ~ A/ B,TRUE ~ 1)) %>%
mutate(paste('DEPTH_','VOLUME') = # At this line i shall be third element of iter
case_when(DEPTH == iter[i] ~ A/ B,TRUE ~ 1))
是否有人建议如何编写通用脚本/功能,是否能够对具有不同LEVELS值的任何数据帧执行此聚合?
级别1是主要的“之上层次结构”(树根)-第一子层次结构(级别2)。最后一个“ Sub-Sub层次结构”是3级。但是通常,我们可以拥有三个以上的级别-这就是为什么我要使该过程自动化。
头体积: 计算一次-创建两次的原因,因此TREE_HEAD(树根)的计算结果为1/100,因为所有子级都从该根开始。
解决方法
这将提供与您的代码相同的输出,并且在DEPTH具有更多级别时也应起作用。此外,它还可将您从for
循环中救出来:
df %>%
fastDummies::dummy_cols(select_columns = 'DEPTH') %>%
mutate_at(vars(starts_with('DEPTH_')),funs(.*A/B)) %>%
rename(HEAD_VOLUME=DEPTH_1) %>%
mutate(HEAD_VOLUME=HEAD_VOLUME[1]) %>%
mutate_at(vars(starts_with('DEPTH_')),~ifelse(.==0,1,.))
下面是输出(与代码中的内容相同):
LEVEL A B DEPTH HEAD_VOLUME DEPTH_2 DEPTH_3
1 1 1 100 1 0.01 1.00 1.0
2 1.1 3 20 2 0.01 0.15 1.0
3 1.2 20 20 2 0.01 1.00 1.0
4 1.1.1 10 20 3 0.01 1.00 0.5