r - R基于列的分组和其他适用列的值构建动态列表
问题描述
我目前在 R 中工作,并正在尝试创建动态列表。我有一个数据表,其中包含以下列的值 - study_site、anthro、modnum 和 list_val。每个研究站点值都有 anthro、modnum 和 list_val 的不同组合。
我想采用以下代码并使其动态构建,而不是将每个研究名称和 anthro 值硬编码到 if 语句中,因为每个 study_site 值都没有每种类型的 anthro 值(特技、uwei 和浪费),但有些人这样做。此外,并非所有 study_site 值都具有所有 modnum 值 (1-5),但每个值都包含 5 个中的一些组合。
数据表中的list_val列对应于列表中每一项的第一部分,=号右侧的第二部分可以从同一张表中的anthro和modnum值中拉取
(即其中 list_val==paste0("lmod_",anthro,modnum)
if(y=="one"){
if(anthro=="stunt")
{l <- list(lstunt1 = lmod_stunt1, lstunt3 = lmod_stunt3, lstunt4 = lmod_stunt4, lstunt5 = lmod_stunt5)}
if(anthro=="uwei")
{l <- list(luwei1 = lmod_uwei1, luwei3 = lmod_uwei3, luwei4 = lmod_uwei4, luwei5 = lmod_uwei5)}
if(anthro=="waste")
{l <- list(lwaste1 = lmod_waste1, lwaste3 = lmod_waste3, lwaste4 = lmod_waste4, lwaste5 = lmod_waste5)}
}
以下是数据表的一小部分,用于快速查看:
study_site anthro modnum list_val
four stunt 1 lstunt1
four stunt 3 lstunt3
four stunt 4 lstunt4
four stunt 5 lstunt5
four uwei 1 luwei1
four uwei 3 luwei3
four uwei 4 luwei4
four uwei 5 luwei5
four waste 1 lwaste1
four waste 3 lwaste3
four waste 4 lwaste4
four waste 5 lwaste5
我知道我可能必须按 study_site 和 anthro 值进行分组,但我不完全确定如何执行此步骤或后续步骤。是否可以动态构建这些列表?
这是原始表的一部分的 dput 值:
structure(list(study_site = c("one", "one", "one", "one", "one",
"one", "one", "one", "one", "one", "one", "one", "one", "one",
"one", "two", "two", "two", "two", "two", "two", "two", "two",
"two", "two", "two", "two", "two", "two", "two", "three", "three",
"three", "three", "three", "three", "three", "three", "three",
"three", "four", "four", "four", "four", "four", "four", "four",
"four", "four", "four", "four", "four"), anthro = c("stunt",
"stunt", "stunt", "stunt", "stunt", "uwei", "uwei", "uwei", "uwei",
"uwei", "waste", "waste", "waste", "waste", "waste", "stunt",
"stunt", "stunt", "stunt", "stunt", "uwei", "uwei", "uwei", "uwei",
"uwei", "waste", "waste", "waste", "waste", "waste", "stunt",
"stunt", "stunt", "stunt", "uwei", "uwei", "uwei", "waste", "waste",
"waste", "stunt", "stunt", "stunt", "stunt", "uwei", "uwei",
"uwei", "uwei", "waste", "waste", "waste", "waste"), modnum = c(1,
2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2,
3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 1, 3, 4,
5, 1, 3, 4, 5, 1, 3, 4, 5), poisson_model = c(1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1), list_val = c("lstunt1", "lstunt2", "lstunt3",
"lstunt4", "lstunt5", "luwei1", "luwei2", "luwei3", "luwei4",
"luwei5", "lwaste1", "lwaste2", "lwaste3", "lwaste4", "lwaste5",
"lstunt1", "lstunt2", "lstunt3", "lstunt4", "lstunt5", "luwei1",
"luwei2", "luwei3", "luwei4", "luwei5", "lwaste1", "lwaste2",
"lwaste3", "lwaste4", "lwaste5", "lstunt1", "lstunt2", "lstunt3",
"lstunt4", "luwei2", "luwei3", "luwei4", "lwaste2", "lwaste3",
"lwaste4", "lstunt1", "lstunt3", "lstunt4", "lstunt5", "luwei1",
"luwei3", "luwei4", "luwei5", "lwaste1", "lwaste3", "lwaste4",
"lwaste5")), row.names = c(NA, -52L), class = c("data.table",
"data.frame"))
解决方案
你在找expand.grid
吗?
d <- transform(expand.grid(study_site=c("one", "two", "three", "four"),
anthro=c("stunt", "uwei", "waste"),
modnum=1:5,
poisson_model=1),
list_val=Reduce(paste0, cbind("l", d[c("anthro", "modnum")])))
d <- d[order(d$study_site, d$anthro, d$modnum), ]
head(d)
# study_site anthro modnum poisson_model list_val
# 1 one stunt 1 1 lstunt1
# 13 one stunt 2 1 lstunt2
# 25 one stunt 3 1 lstunt3
# 37 one stunt 4 1 lstunt4
# 49 one stunt 5 1 lstunt5
# 5 one uwei 1 1 luwei1