当前,在编写将计算和打印t检验结果的For Loop过程中,我正在测试吸烟者之间所有变量(faminc,fatheduc,motheduc,white,cigtax,cigprice)的均值差异和不吸烟者(“吸烟”; 0 =不吸烟,1 =吸烟者)
当前代码:
type <- c("faminc", "fatheduc", "motheduc", "white", "cigtax", "cigprice")
count <- 1
for(name in type){
temp <- subset(data, data[name]==1)
cat("For", name, "between smokers and non, the difference in means is: \n")
print(t.test(temp$smoke))
count <- count + 1
}
但是,我觉得'temp'不属于这里,并且在运行代码时得到:
For faminc between smokers and non, the difference in means is:
Error in t.test.default(temp$smoke) : not enough 'x' observations
简单的代码
t.test(faminc~smoke,data=data)
满足了我的需求,但是我想对for循环有一些练习/更好的理解。
答案 0 :(得分:0)
这是一个使用File
和lapply()
数据集来生成OP中请求的输出的解决方案。
mtcars
...以及输出:
data(mtcars)
varList <- c("wt","disp","mpg")
results <- lapply(varList,function(x){
t.test(mtcars[[x]] ~ mtcars$am)
})
names(results) <- varList
for(i in 1:length(results)){
message(paste("for variable:",names(results[i]),"difference between manual and automatic transmissions is:"))
print(results[[i]])
}
答案 1 :(得分:0)
比较有效的代码...
t.test(faminc~smoke,data=data)
您要指定变量(faminc~smoke
之间的关系,这意味着您认为faminc
的平均值在smoke
的值之间是不同的,并且您希望使用{{1 }}数据集。
循环中的等效行...
data
...仅在选择 print(t.test(temp$smoke))
,temp$smoke
等中的每个值都为1
的那些对象之后,才给出faminc
的单列。因此即使您写...
fatheduc
您的print(t.test(faminc~smoke, data=data))
仍然无所事事。
如果您想以此方式进行一系列睾丸手术,则可以
count
尽管这不是我想知道的事情,但是您的变量显示了家庭(type <- c("faminc", "fatheduc", "motheduc", "white", "cigtax", "cigprice")
for(name in type){
cat("For", name, "between smokers and non, the difference in means is: \n")
print(t.test(name~smoke, data=data))
}
),父亲(faminc
),母亲(fatheduc
),种族(motheduc
,税(white
)和价格(cigtax
)。
我想不出您为什么要比较吸烟者和不吸烟者之间的平均香烟价格或税收,因为后者不会吸烟,因此没有任何价值!
您的代码建议这些虽然可能是二进制变量(因为您正在过滤每个值为cigprice
的变量),但对我来说,这甚至不是您想要执行的操作。
如果您希望查看数据的子集,则执行回归而不是循环的tidier方法是使用purrr。
将来在询问时,请考虑提供数据样本以及完整复制和粘贴的输出,如How to create a Minimal, Complete, and Verifiable example - Help Center - Stack Overflow中所建议。因为这样可以使人们更详细地了解您在做什么(例如,我只是在猜测您的变量)。借助统计数据,也可以阐明您的假设,也可以帮助人们了解您要总体实现的目标。