我有一个数据帧dfA(真正的数据帧有1000行和40万列)。从第6列开始,变量名称是由x组成的“三元组”,带有x个不同的前缀(GT_x,N_x,E_x),其中x = rs1,rs7,rs300,rs502等:
ID SEX PV GAN GAE GT_rs1 N_rs1 E_rs1 GT_rs7 N_rs7 E_rs7 ...
2 0 7.8 0.3 0.4 0 1 1 1 0 2 ...
6 1 6.4 0.35 0.55 0 0 1 1 1 2 ...
以下是我的数据的可复制示例:
dfA = data.frame(rbind(c("ID","SEX","PV","GAN","GAE","GT_rs1","N_rs1","E_rs1","GT_rs7","N_rs7","E_rs7"),
c(2,0,7.8,0.3,0.4,0,1,1,1,0,2),
c(6,1,6.4,0.35,0.55,0,0,1,1,1,2)))
dfA = dfA %>% row_to_names(row_number = 1)
使用R,我想运行以下形式的线性回归:
lm(PV ~ SEX + GAN + GT_x + N_x)
其中x是rs1,rs7等。因此,我需要对成对的变量逐列进行迭代。我想获取不同协变量(SEX,GAN,GT_x和N_x)的估计值,std.error,统计量和p.value。 SEX =分类变量; PV,GAN =定量变量; GT_x,N_x,E_x =加性变量。
答案 0 :(得分:2)
这是在一个简单管道中使用purrr
的解决方案。
您只需要创建GT_x
和N_x
的列表即可使用。您可以使用一些正则表达式来做到这一点。
library(purrr)
nn <- names(df)
pattern <- "^GT_|^N_"
vars <- nn[grepl(pattern, nn)] # get the variables that start with GT_ and N_
x <- sub(pattern, "", vars) # get every x
split(vars, x) %>%
map(paste, collapse = " + ") %>%
sprintf("PV ~ SEX + GAN + %s", .) %>%
map(lm, data = df) %>%
map_dfr(broom::tidy, .id = "model")
这将返回唯一的数据框。每个模型由列model
标识。
如果您希望使用列表,只需将map_dfr
替换为map
并删除.id
。
在这里,我为您的数据创建了一个可复制的示例:
set.seed(1)
df <- data.frame(ID = 1:1000,
SEX = sample(0:1, 1000, replace = TRUE),
PV = rnorm(1000),
GAN = rnorm(1000),
GAE = rnorm(1000))
newcols <- unlist(lapply(c("GT_rs", "N_rs", "E_rs"), paste0, sample(100, 50)))
df[newcols] <- replicate(50, rnorm(1000))
df
答案 1 :(得分:1)
您可以通过将字符串粘贴在一起来构建公式-我们只需要知道要粘贴在一起的字符串即可。
这应该有效-未经测试,因为您共享的数据未与fruitInstance
共享,因此无法复制/粘贴,并且只有一组协变量,因此不能说明问题的复杂性。如果遇到问题,请共享复制/粘贴的数据以进行说明,我将尝试调试。
dput
答案 2 :(得分:1)
自从江户编辑了解决方案以来,我添加了它的变体:
library(purrr)
library(dplyr)
library(broom)
list("GT_rs", "N_rs") %>%
map(~dfA %>%
select(matches(paste0(.x,"\\d+"))) %>%
names %>%
sub(pattern = .x, replacement = "")) %>%
reduce(intersect) %>% # until here we get the variables GT_rsx, N_rsx
sprintf("PV ~ SEX + GAN + GT_rs%s + N_rs%s", ., .) %>%
map(lm, data = dfA) %>%
map_dfr(tidy, .id = "model") %>%
group_by(model) %>%
mutate(suffix = sub("N_rs", "", term[grepl("^N_rs\\d+$", term)]))