【发布时间】:2020-08-29 13:03:28
【问题描述】:
如何使用 dplyr::mutate 评估每一行的字符串?
我是 R 的 2 个月新手。我正在练习 tidyverse 来操作数据和运行统计数据。
我正在尝试运行多个线性回归并获得每个回归变量的 p 值。
这里是可重复的样本;
require(tidyverse)
df <-
tibble(serialNO = seq(1,10,1),
lactate = c(1.3, 1.6, 2.6, 3.5, 1.2, 1.1, 3.6, 3, 1.9, 5.3),
BMI = c(20, 27, 23, 25, 23, 23, 20, 24, 19, 23),
Afib = c(0, 0, 1, 0, 0, 0, 1, 0, 0, 0),
LVEF = c(65, 68, 61, 58, 57, 58, 25, 59, 66, 58))
# A tibble: 10 x 5
serialNO lactate BMI Afib LVEF
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1.3 20 0 65
2 2 1.6 27 0 68
3 3 2.6 23 1 61
4 4 3.5 25 0 58
5 5 1.2 23 0 57
6 6 1.1 23 0 58
7 7 3.6 20 1 25
8 8 3 24 0 59
9 9 1.9 19 0 66
10 10 5.3 23 0 58
多项式线性回归的代码每行存储为字符串,如下所示;
reg_com <- c("lm(lactate~sex+BMI+Afib, data=df)",
"lm(lactate~sex+BMI+LVEF, data=df)",
"lm(lactate~sex+Afib+LVEF, data=df)",
"lm(lactate~BMI+Afib+LVEF, data=df)")
# A tibble: 4 x 1
reg
<chr>
1 lm(lactate~sex+BMI+Afib, data=df)
2 lm(lactate~sex+BMI+LVEF, data=df)
3 lm(lactate~sex+Afib+LVEF, data=df)
4 lm(lactate~BMI+Afib+LVEF, data=df)
我想要的结果是这样的。
# A tibble: 4 x 5
reg sex BMI Afib LVEF
<chr> <chr> <chr> <chr> <chr>
1 lm(lactate~sex+BMI+Afib, data=df) p p p NA
2 lm(lactate~sex+BMI+LVEF, data=df) p p NA p
3 lm(lactate~sex+Afib+LVEF, data=df) p NA p p
4 lm(lactate~BMI+Afib+LVEF, data=df) NA p p p
tibble 中的p 是每个线性回归的变量的 p 值。
由于我花了整整 2 天时间,我尝试使用 'for loop' ,但我收到了错误消息
reg_sum <- tibble(reg = as.character())
for(i in 1:length(reg_com)) {
a <-
df %>%
print(eval(parse(text=paste0(",reg_com[i],")))) %>%
tidy %>%
select(term, p.value) %>%
column_to_rownames(var = "term") %>% # prepare for transpose
t %>%
as_tibble %>%
mutate(reg = reg_com[i])
reg_sum <- full_join(reg_sum, a)
}
error: C stack usage 15923360 is too close to the limit
我正在尝试这样做,因为我需要执行超过 10k 的线性回归组合。
如果可能的话,我想用 dplyr 来做。 (太酷了!)
请帮帮我!
【问题讨论】:
-
欢迎来到 SO。到目前为止,您尝试了哪些方法?您在哪里寻求指导?
-
你能更新一个最小的可重现样本吗?参考stackoverflow.com/questions/5963269/…
-
@Peter 我更新了我的最新代码。在此之前,我尝试使用 map(),到目前为止,它在进行简单的线性回归时仍然有效。
-
@Mohanasundaram 我更新了可重现的样本。感谢您的建议!
标签: r regression dplyr