如何在 R 中每次循环使用不同变量的命令集?

How to loop set of commands with different variable each time in R?

我对 R 编码很陌生,因此我真的需要你的帮助 运行 R 中的循环命令.

我有一个很大的 table ("variable_table.txt"),列如下:

sample  BMI  var1_LRR   var1_BAF    var2_LRR    var2_BAF    var3_LRR var3_BAF ........ var200_LRR var200_BAF

AA     18.9    0.27       0.99        0.18        0.99        0.11         1  ........   0.20        0.99

BB     27.1    0.23       1           0.13        0.99        0.17         1  ........   0.23        0.99

我想运行一个回归命令如下:

dataset<- read.table ("variable_table.txt", na.strings="NA", header=TRUE)

linear_var1 <- lm (BMI ~ var1_LRR + var1_BAF,data=dataset)

summary(linear_var1)

confint_var1_CI <- confint(linear _var1, level=0.95)

confint_var_CI

问题一: 有人可以帮助我如何执行上述命令,并使用下一个变量(从 var1 到 var2,然后到 var3,直到 var200)再次重复它们,而不必单独 运行 它。

问题二: 如何将每个 运行 结果编译成一个编译的 table?

您可以尝试这样的操作:

for ( i in 1:200 ) {

  # build the formula
  form<-as.formula(paste("BMI ~ **var", i, "**_LRR + **var", i, "**_BAF", sep=""))

  # make a character string with the lm-instruction, using the formula above
  code.lm<-paste("lm.V", i, "<-lm(form, data=dataset)", sep="")
  # dynamically execute the code in that string
  eval(parse(text=code.lm))

  # create a string xith the summary code
  code.summ<-paste("summary(lm.V", i, ")", sep="")
  # dynamically execute the string
  eval(parse(text=code.summ))

}

我做到了 'summary' 指令,但其余类似:你 'paste' 你的代码在一个字符串中,然后用 'eval(parse(text=))' 执行它。

之后您可以访问变量 'lm.V1', ... 'lm.V200'

最简单的方法是对 data.frame 进行子集化,例如

mydata <- data.frame(y = runif(100),
                     foo1 = runif(100), bar1 = runif(100),
                     foo2 = runif(100), bar2 = runif(100))

out <- list()

for (i in 1:2)
  out[[i]] <- lm(y ~., data = mydata[, c("y", paste(c("foo", "bar"), i, sep=""))])

关于将输出保存到 table,首先你必须决定要保存输出的哪一部分(例如系数)

mytab <- matrix(NA, 2, 3)
for (i in 1:2)
  mytab[i, ] <- out[[i]]$coefficients

您还可以使用 broom 库从 lm 个对象中提取 "tidy" 输出。

library(broom)
tidy(out[[1]])
##          term   estimate  std.error statistic           p.value
## 1 (Intercept)  0.5060922 0.07619095  6.642419 0.000000001794162
## 2        foo1 -0.1567166 0.10023700 -1.563461 0.121201059993118
## 3        bar1  0.1578192 0.10404012  1.516907 0.132542574934363

接下来,您可以使用 rbind.

组合这些输出

如果您先重新排列数据框,您将可以更轻松地使用它:

library(tidyr)
# gather all columns into a single column
tidied <- gather(dataset, var, value, -sample, -BMI)

# separate the "var" column into varnum (var1, var2...) and variable
tidied <- separate(tidied, var, c("var1", "variable"))

# now spread the two variables (BAF and LRR) back across columns
tidied <- spread(tidied, variable, value)

您最终会得到一个包含五列的 table xsampleBMIvar(即 var1var2、等等)、LRRBAF。它的行数将是当前 table 的 200 倍。请注意,使用 %>% 运算符,您可以按照以下步骤执行上述步骤:

library(dplyr)
tidied <- dataset %>%
  gather(var, value, -sample, -BMI) %>%
  separate(var, c("var", "variable")) %>%
  spread(variable, value)

完成重新排列后,您可以使用 dplyr 的 group_bydo 以及 broom:

非常轻松地在每个变量内执行线性回归
library(broom)
coefs <- tidied %>%
  group_by(var) %>%
  do(tidy(lm(BMI ~ BAF + LRR, data = .), conf.int = TRUE))

例如,如果您的数据集是:

set.seed(1)
dataset <- data.frame(sample = 1:100, BMI = rnorm(100),
                      var1_LRR = rnorm(100), var1_BAF = runif(100),
                      var2_LRR = rnorm(100), var2_BAF = runif(100),
                      var3_LRR = rnorm(100), var3_BAF = runif(100))

以上代码的结果为:

Source: local data frame [9 x 8]
Groups: var

   var        term      estimate  std.error    statistic   p.value    conf.low conf.high
1 var1 (Intercept)  0.1298513867 0.17715588  0.732978145 0.4653394 -0.22175399 0.4814568
2 var1         BAF -0.0415096698 0.30068830 -0.138048836 0.8904880 -0.63829271 0.5552734
3 var1         LRR  0.0001270982 0.09550805  0.001330759 0.9989409 -0.18942994 0.1896841
4 var2 (Intercept)  0.1064316834 0.18173583  0.585639517 0.5594779 -0.25426363 0.4671270
5 var2         BAF  0.0144181386 0.31656921  0.045544981 0.9637666 -0.61388410 0.6427204
6 var2         LRR -0.0470190629 0.09340229 -0.503403723 0.6158217 -0.23239676 0.1383586
7 var3 (Intercept)  0.0616288934 0.17865709  0.344956329 0.7308741 -0.29295597 0.4162138
8 var3         BAF  0.1045320710 0.31246736  0.334537572 0.7386962 -0.51562914 0.7246933
9 var3         LRR  0.1118595808 0.07714709  1.449952134 0.1502976 -0.04125603 0.2649752