在 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 应用于春季女性。
基本上,我想要这些分组:
非常感谢任何帮助。谢谢!
编辑:我想我正在寻找一种不会创建新列的解决方案,因为我需要再次根据列性别、年龄等级、登入状态和季节进行工作。
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())