条件子集;将相同的功能应用于独特的群体

问题描述 投票:0回答:1

在 R 中,我希望有条件地对我的数据集进行子集化,以便我可以将相同的函数应用于不同的数据组。这是虚拟数据:

data <- data.frame(id = seq(1, 100, by = 1),
                 sex = sample(c('M', 'F'), 100, replace = TRUE),
                 age_class = sample(c('A', 'S'), 100, replace = TRUE), # A = adult, S = subadult
                 season = sample(c('spring', 'autumn'), 100, replace = TRUE),
                 den_status = sample(c(0,1), 100, replace = TRUE), # 1 = yes, 0 = no. Only females can den and get a 1 or 0, males are all dummy coded as 0
                 weight = sample(80:600, 100, replace = TRUE),
                 offspring = sample(c('Y','N'), 100, replace = TRUE),
                 albumin = rnorm(100, 5, 2),
                 cortisol = rnorm(100, 30, 12),
                 calcium = rnorm(100, 0.3, 0.005),
                 globulin = rnorm(100, 1.9, 0.3),
                 insulin = rnorm(100, 3, 0.13))

最初,我按性别、年龄等级和登入状态对数据进行了分组,并为每个分组应用了一个名为 mod.zscore 的自定义函数。该函数作用于 albumin:insulin 列,然后我创建了包含输出数据的新列。

data.new <- data %>%
  group_by(sex, age_class, den_status) %>%
  mutate(across(c(albumin:insulin), mod.zscore,
            .names = "{.col}_{'zscore'}")) %>% ungroup()

这很好用,可以完成我需要它做的事情。我卡住的地方是我需要有条件地对数据进行子集化或分组,以便我仅在 sex == 'female'、age_class == 'A' 和 season == 'spring' 时按 den_status 分组。目前,我的代码按 den_status 对男性和女性进行分组,这不一定是个问题,因为无论如何所有男性的 den_status = 0。问题出现在我只希望 den_status 应用于春季女性。

基本上,我想要这些分组:

  1. Sex = F, age class = A, season = spring, den_status = 0
  2. Sex = F, age class = A, season = spring, den_status = 1
  3. 性别=F,年龄段=S,季节=春季
  4. 性别=F,年龄段=A,季节=秋季
  5. 性别=F,年龄段=S,季节=秋季
  6. 性别=M,年龄段=A,季节=春季
  7. 性别=M,年龄段=S,季节=春季
  8. 性别=M,年龄段=A,季节=秋季
  9. 性别=M,年龄段=S,季节=秋季

非常感谢任何帮助。谢谢!

编辑:我想我正在寻找一种不会创建新列的解决方案,因为我需要再次根据列性别、年龄等级、登入状态和季节进行工作。

r dplyr group-by tidyverse subset
1个回答
0
投票
library(dplyr)
data.new <- data %>%
  mutate(season2=case_when(sex == "F" & age_class == "A" & season == "spring" & den_status == 0~ "spring0",
                           sex == "F" & age_class == "A" & season == "spring" & den_status == 1~ "spring1",
                           TRUE~ season)) %>%
  group_by(sex,age_class,season2)%>%
  mutate(n=n())

© www.soinside.com 2019 - 2024. All rights reserved.