R不在循环中打印正确的东西

时间:2016-01-07 07:27:34

标签: r

我正在尝试打印使用table函数的“结果”,但是当我尝试在这里使用代码时,我得到了一些非常奇怪的东西:

    for (i in 1:4){
  print (table(paste("group",i,"$", "BMI_obese",sep=""), paste("group",i,"$","A1.1", sep="")))
}

这是R输出的结果:

                 group1$A1.1
group1$BMI_obese           1

                 group2$A1.1
group2$BMI_obese           1

                 group3$A1.1
group3$BMI_obese           1

                 group4$A1.1
group4$BMI_obese           1

但是当我输入语句而不在循环中键入时:

table(group2$BMI_obese, group2$A1.1)

我得到了我想要的东西:

   1  2  3  4  5
0 51 20  9  8  0
1 37 20 15  6  4

是否有人知道我的for循环代码的哪一部分不正确或可以修改以符合我打印循环table结果的目的?

嗨,现在我还有另外一个问题。我试图添加一个内部循环,它将列名作为参数,因为我想为每个组数据循环通过多个列(即对于group1,我想有BMI_obese对A1.1的表,BMI_obese vs A1.2 ... BMI_obese vs A1.15。这是我的代码,但不知何故它不起作用,我认为这是因为它没有认识到A1.1,A1.2,......从数据group1,group2,group3,group4获取的列。但是我认为它被视为字符串。我不知道如何解决它:     for(i in 2:4){         for(j in c(“A1.1”,“A1.2”))
                {             print(with(get(paste0(“group”,i)),table(BMI_obese,j)))

            }               
        }   

我不断收到此错误消息: 表中的错误(BMI_obese,j):所有参数必须具有相同的长度

3 个答案:

答案 0 :(得分:1)

好的,您正在尝试使用粘贴构建变量名称,然后执行表格。您只是将变量的名称传递给表,而不是变量对象本身。对于这种方法,您希望使用get()

for (i in 1:4) {
    with(get(paste0("group", i), table(BMI_obese, A1.1))
}
#example saving as a list (using lapply rather than for loop)
group1 <- data.frame(x=LETTERS[1:10], y=(1:10)[sample(10, replace=TRUE)])
group2 <- data.frame(x=LETTERS[1:10], y=(1:10)[sample(10, replace=TRUE)])
result <- lapply(1:2, function(i) with(get(paste0("group", i)), table(x, y)))
#look at first six rows of each:
head(result[[1]])
head(result[[2]])

#example illustrating fetching objects from a string name
data(mtcars)
head(with(get("mtcars"), table(disp, cyl)))
head(with(get("mtcars"), table(disp, "cyl")))
#Error in table(disp, "cyl") : all arguments must have the same length
head(with(get("mtcars"), table(disp, get("cyl"))))

答案 1 :(得分:0)

您的类型使用错误。看到差异:

table(group2$BMI_obese, group2$A1.1)

table(paste(...),paste(...))

那么粘贴会返回什么类型?当然是一些字符串。

编辑: paste(...)并不意味着语法正确,而是paste("group",i,"$", "BMI_obese",sep="")的缩写,或者粘贴在一起的任何内容。

paste(...)返回一些字符串。如果将结果放入表中,则会得到一个字符串表(您获得的意外结果)。您要做的是使用粘贴(...)返回的名称访问变量或字段。就像丹尼尔所说的一样eval就像你说的那样。

for (i in 1:4){
  print (table(eval(paste("group",i,"$", "BMI_obese",sep="")),eval(paste("group",i,"$","A1.1", sep=""))))
}

答案 2 :(得分:0)

您还可以使用evalparse的组合:

x1 <- c(sample(10, 100, replace = TRUE))
y1 <- c(sample(10, 100, replace = TRUE))
table(eval(parse(text = paste0("x", 1))),
      eval(parse(text = paste0("y", 1))))

但是我也说这种方式访问​​变量并不是最好的做法......