2013-01-31 44 views
0

我在R.M。很新,我有两个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 

我想申请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

假设你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() 
+0

大卫你好!非常感谢您的帮助。我自己解决了警告。再次感谢! – Fuv8

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)) 
} 
} 

测试我的女佣是安静的,不同的在你的问题,但我认为,这是你需要的一个(我正在测试吸烟者/不吸烟者的比例是否与男性/女性相同)

编辑:

对于保存在列表中显示的结果:

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) 
} 
} 
+0

Rcoster的建议很扎实。您可以将'print(test)'添加到每个循环以查看结果。或者,'prop.test'的结果是一个列表。您可以首先在循环之前用'results < - vector(“list”,nrow(DF1)* nrow(DF2))''初始化一个正确大小的空列表。然后将'test < - '更改为结果[[I * j]] < - ',并且列表将随着循环的进行而填充。 –

+0

结果[[i * j]]将订阅一些结果(如i = 1,j = 2和j = 2,i = 1),result [[length(result)+ 1]]应该可以工作在开始的空列表 – Rcoster

+0

好点!做他所说的。 –