微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

dplyr根据我们正在迭代的元素来更改新列

如何解决dplyr根据我们正在迭代的元素来更改新列

我想要做的是基于我们迭代的变量的独特元素执行一些聚合。

我能够执行需要手动编写的内容。但是,我想对此过程进行概括,以便可以自动执行。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。