按名称在R中的变量子集上循环

按名称在R中的变量子集上循环,r,arrays,for-loop,crosstab,R,Arrays,For Loop,Crosstab,数据框have包含数千个变量。一个变量是一个名为treatgrp的治疗指示器,它包含1、2或3的值)。其他五个变量被称为:g_-cA,r_-cA,g_-ccA,r_-ccA,和g_-grp。它们没有按顺序出现 我想生成频率表,将treatgrp与其他五个感兴趣的变量进行比较。我目前使用了一些壁纸语法: table(have$treatgrp, have$g_cA, deparse.level = 2) table(have$treatgrp, have$r_cA, deparse.lev

数据框have包含数千个变量。一个变量是一个名为
treatgrp
的治疗指示器,它包含1、2或3的值)。其他五个变量被称为:
g_-cA
r_-cA
g_-ccA
r_-ccA
,和
g_-grp
。它们没有按顺序出现

我想生成频率表,将
treatgrp
与其他五个感兴趣的变量进行比较。我目前使用了一些壁纸语法:

table(have$treatgrp, have$g_cA,   deparse.level = 2)
table(have$treatgrp, have$r_cA,   deparse.level = 2)
table(have$treatgrp, have$g_ccA,  deparse.level = 2)
table(have$treatgrp, have$r_ccA,  deparse.level = 2)
table(have$treatgrp, have$g_grp,  deparse.level = 2)
这就行了。但是我想调用一次
table()
,然后迭代五个不同的感兴趣的变量。我试着这样做:

myvars <- c("g_cA", "r_cA", "g_ccA", "r_ccA", "g_grp")

for (i in 1:length(myvars)){
  table(have$treatgrp, have[,myvars[i]],  deparse.level = 2)
}

myvars我想到的一个解决方案:

创建一个较小的数据框,其中包含来自
have
的感兴趣变量,并循环索引

have_mini <- have[,c("treatgrp","g_cA", "r_cA", "g_ccA", "r_ccA", "g_grp")]

但我仍在调试:即使我没有收到错误,似乎也没有打印任何内容。除此之外,我确信还有一种我不知道的更好的方法。

我想到的一种解决方案:

创建一个较小的数据框,其中包含来自
have
的感兴趣变量,并循环索引

have_mini <- have[,c("treatgrp","g_cA", "r_cA", "g_ccA", "r_ccA", "g_grp")]

但我仍在调试:即使我没有收到错误,似乎也没有打印任何内容。除此之外,我确信还有一种我不知道的更好的方法。

iris
数据集为例,使用
lappy
是否可行

iris$var1 <- sample(letters, 150, replace = T)
iris$var2 <- sample(letters, 150, replace = T)
iris$var3 <- sample(letters, 150, replace = T)
myvars <- c("var1", "var2", "var3")
lapply(iris[myvars], function(x) table(iris$Species, x))
# $var1
#             x
#              a b c d e f g h i j k l m n o p q r s t u v w x y z
#   setosa     1 1 0 3 2 2 0 1 2 4 2 1 1 4 3 1 4 0 3 0 4 3 3 2 0 3
#   versicolor 3 1 2 3 0 4 1 3 5 0 1 0 1 3 5 2 2 1 5 1 2 0 1 1 1 2
#   virginica  4 0 1 1 3 4 2 1 2 1 2 4 1 1 1 2 2 2 3 3 0 2 2 2 3 1

# $var2
#             x
#              a b c d e f g h i j k l m n o p q r s t u v w x y z
#   setosa     3 1 1 3 3 3 2 2 2 2 1 1 2 1 0 4 1 2 2 4 4 3 2 0 1 0
#   versicolor 3 0 1 1 5 3 3 3 2 2 1 2 2 4 1 4 2 3 2 0 2 1 2 1 0 0
#   virginica  0 2 1 4 3 0 0 1 1 0 4 2 3 2 1 2 0 3 2 2 2 0 2 2 5 6

# $var3
#             x
#              a b c d e f g h i j k l m n o p q r s t u v w x y z
#   setosa     4 2 4 2 0 4 0 3 3 2 0 1 2 0 0 2 1 3 2 1 1 2 2 1 5 3
#   versicolor 0 3 1 3 1 1 1 0 1 1 3 2 1 0 0 4 4 1 3 6 2 2 2 3 2 3
#   virginica  3 0 3 3 2 0 3 1 1 2 0 2 4 4 1 4 1 3 4 0 1 1 2 3 2 0

iris
数据集为例,使用
lappy
是否可行

iris$var1 <- sample(letters, 150, replace = T)
iris$var2 <- sample(letters, 150, replace = T)
iris$var3 <- sample(letters, 150, replace = T)
myvars <- c("var1", "var2", "var3")
lapply(iris[myvars], function(x) table(iris$Species, x))
# $var1
#             x
#              a b c d e f g h i j k l m n o p q r s t u v w x y z
#   setosa     1 1 0 3 2 2 0 1 2 4 2 1 1 4 3 1 4 0 3 0 4 3 3 2 0 3
#   versicolor 3 1 2 3 0 4 1 3 5 0 1 0 1 3 5 2 2 1 5 1 2 0 1 1 1 2
#   virginica  4 0 1 1 3 4 2 1 2 1 2 4 1 1 1 2 2 2 3 3 0 2 2 2 3 1

# $var2
#             x
#              a b c d e f g h i j k l m n o p q r s t u v w x y z
#   setosa     3 1 1 3 3 3 2 2 2 2 1 1 2 1 0 4 1 2 2 4 4 3 2 0 1 0
#   versicolor 3 0 1 1 5 3 3 3 2 2 1 2 2 4 1 4 2 3 2 0 2 1 2 1 0 0
#   virginica  0 2 1 4 3 0 0 1 1 0 4 2 3 2 1 2 0 3 2 2 2 0 2 2 5 6

# $var3
#             x
#              a b c d e f g h i j k l m n o p q r s t u v w x y z
#   setosa     4 2 4 2 0 4 0 3 3 2 0 1 2 0 0 2 1 3 2 1 1 2 2 1 5 3
#   versicolor 0 3 1 3 1 1 1 0 1 1 3 2 1 0 0 4 4 1 3 6 2 2 2 3 2 3
#   virginica  3 0 3 3 2 0 3 1 1 2 0 2 4 4 1 4 1 3 4 0 1 1 2 3 2 0

在循环内部,您需要使用print()


data在循环内部,您需要使用print()


数据您能添加一些示例数据吗?您能添加一些示例数据吗?
data <- data.frame("id" = c(1:12), "treatment" = c(1, 2, 3), 
                   "v1" = c("a", "b"),
                  "v2" = c("X", "Y", "Z"))
vars <- c("v1", "v2")

for (i in 1:length(vars)) {
  t <- table(data[,vars[i]], data$treatment)
  print(t)
}