首页 > 解决方案 > 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"))

标签: rlist

解决方案


你在找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

推荐阅读