我是R的新手。我有两个data.frame看起来像这样:
DF1
List_name Smokers Not_smokers List1 30 100 List2 10 50 List3 3 10 List4 12 85 List5 56 60 List6 90 120
DF2
List_name Male Female List1 23 123 List2 45 654 List3 35 110 List4 145 850 List5 89 234 List6 56 765
我想在ex之间应用prop.test:DF2的第一行和DF1的每一行,然后是DF2的第二行和DF1的每一行,然后是DF2的第三行和每一行DF1的线路等等,直到DF2的所有线路结束。因此,由于DF1具有尺寸:100(行)X2(列)而DF2具有30(行)X2(列),所以最终我将进行30X100测试,因此进行3000次测试。
我尝试的是以下内容(使用另一个已发布问题的函数):
for (i in 1:length(DF2)){
test <- apply(DF1, 1, function(x) prop.test(rbind(x, as.numeric(DF2[[i]]), correct=TRUE, alternative="two.sided", conf.level=.99))
}
但它不起作用。显然,由于我是初学者,我无法解决错误。另一个问题是我执行的每个测试都将保存在一个单独的变量中和/或打印在一个单独的文件中。
有人能帮帮我吗? 如果问题不明确,请告诉我。我会在一秒钟内编辑它。
最好,
˚F
答案 0 :(得分:1)
初学者最简单的方法是使用2个循环
DF1 <- read.table(text='List_name Smokers Not_smokers
List1 30 100
List2 10 50
List3 3 10
List4 12 85
List5 56 60
List6 90 120',header=T)
DF2 <- read.table(text='List_name Male Female
List1 23 123
List2 45 654
List3 35 110
List4 145 850
List5 89 234
List6 56 765', header=T)
test <- NULL
for (i in 1:nrow(DF2)) {
for (j in 1:nrow(DF1)) {
test <- c(test,prop.test(c(DF1[j,2], DF2[i,2]),c(DF1[j,3]+DF1[j,2], DF2[i,3]+DF2[i,2]), correct=TRUE, alternative="two.sided", conf.level=.99))
}
}
我的女佣的测试与你的问题中的安静不同,但我认为这是你需要的(如果吸烟者/没有吸烟者的比例与男性/女性相同,我会测试)< / p>
编辑:
将结果保存在列表中:
test <- list()
for (i in 1:nrow(DF2)) {
for (j in 1:nrow(DF1)) {
test[[length(test)+1]] <- prop.test(c(DF1[j,2], DF2[i,2]),c(DF1[j,3]+DF1[j,2], DF2[i,3]+DF2[i,2]), correct=TRUE, alternative="two.sided", conf.level=.99)
}
}
答案 1 :(得分:0)
假设您的DF1和DF2对象是data.frame。因为您使用DF2作为列表...
DF1 <- data.frame(Smokers=c(30, 10, 3, 12, 56, 90), Not_smokers=c(100, 50, 10, 85, 60, 120))
DF2 <- data.frame(M=c(23, 45, 35, 145, 89, 56), F=c(123, 654, 110, 850, 234, 765))
test <- vector("list", dim(DF1)[1]*dim(DF2)[1])
k=1
for (i in 1:dim(DF2)[1]){
for(j in 1:dim(DF1)[1]){
test[[k]] <- prop.test(rbind(as.numeric(DF1[j,]), as.numeric(DF2[i,])), correct=TRUE, alternative="two.sided", conf.level=.99)
k=k+1
}
}
# the chi-square test produce warnings
warnings()