0

我有许多按顺序编号的列。例如q1, q2,q3等。我还有一个指示变量 ( ind) 用于每个观察的控制或治疗状态。我想对每个问题的治疗组和对照组之间的均值差异进行一系列 t 检验。我想要一个循环,将所有测试的 p 值输出到矩阵中,而不是逐个问题地输入。

我认为问题在于我如何使用paste(). 我认为我无法创建一个实际调用数据的对象。我认为 R 试图在文本上运行 t.test,而不是将文本连接到它要引用的数据。强文本

data <- data.frame(matrix(NA,50,8))

colnames(data) <- c("q1","q2","q3","q4","q5","q6","q7","ind")

data[,"ind"]<- c(rep(0,25),rep(1,25))

set.seed(42)
data[,"q1"] <- rnorm(50)
data[,"q2"] <- rnorm(50)
data[,"q3"] <- rnorm(50)
data[,"q4"] <- rnorm(50)
data[,"q5"] <- rnorm(50)
data[,"q6"] <- rnorm(50)
data[,"q7"] <- rnorm(50)

results <- data.frame(matrix(NA,7,2))

## Attempt One
for(i in 1:7){
results[i,1] <- i
a <- paste0("data$q",i,"[data$ind==1]")
b <- paste0("data$q",i,"[data$ind==0]")
results[i,2] <- t.test(a,b)[3]
}

####
# Error in t.test.default(a, b) : not enough 'x' observations
# In addition: Warning messages:
# 1: In mean.default(x) : argument is not numeric or logical: returning NA
# 2: In var(x) : NAs introduced by coercion


###Attempt Two
for(i in 1:7){
results[i,1] <- i
a <- get(paste0("data$q",i,"[data$ind==1]"))
b <- get(paste0("data$q",i,"[data$ind==0]"))
results[i,2] <- t.test(a,b)[3]
}

####
# Error in get(paste0("data$q", i, "[data$ind==1]")) : 
#  object 'data$q1[data$ind==1]' not found

我发现了很多关于如何在 R 中创建变量名的讨论paste,但我正在寻找如何在 R 中调用变量名paste。 1.如何分配给 R 中变量值的 names() 属性 2.如何动态命名变量? 3. 使用 for 循环访问变量,如上面“尝试二”中所尝试的:Change variable name in for loop using R

4

1 回答 1

1

如果您试图将变量作为字符串进行操作,那肯定表明您在找错树。每当您想使用getorassign时,再想一想,您可能做错了。

library(plyr)
library(reshape2_
data_m <- melt(data,id.var = "ind")
ddply(data_m,.(variable),
      function(x) t.test(x$value[x$ind == 1],x$value[x$ind == 0])[[3]])

要不就:

lapply(data[,1:7],function(x) t.test(x[data$ind == 1],x[data$ind == 0])[[3]])
于 2013-06-18T20:00:10.347 回答