循环数据帧比较对

时间:2017-01-17 17:05:20

标签: r dataframe arguments

我创建了以下数据框:

set.seed(42)
df1 = data.frame(pair = rep(c(1:26),2), size = rnorm(52,5.4,1.89))

它表示由“对”列指定的特定大小的随机个体对。

随机分布(5.4,1.89)基于我在研究中采样的组中观察到的数据(N = 26对)。

我现在想问一个非常基本的问题,我无法编写代码:

想象一下平均水平线(5.4),将人口分成两部分:

有多少比例的人与来自同一行的另一个人配对?也就是说,小和大的倾向是否有大而小?

我想比较我观察到的比例与多次“问”上述问题所产生的比例(例如1000次重复)。

在我的研究中,18/26个人与一个类似大小的伴侣在一起,所以我想问“在1000次重复中,相似个体的比例是多少次等于或大于18/26?”这将是我的'p值'。

  

我不知道如何对此进行编码,但在我看来它是这样的:

     

对于'size'列中的每个值:当pair值相等时,执行以下操作:

     

是等于或大于5.4的较大个体?是更小的   个人等于或大于5.4?

     

如果是,请返回“是”

     

OR

     

是等于或小于5.4的较大个体?是更小的   个人等于或小于5.4?

     

如果是,请返回“是”

     

如果以上都不成立,则返回0

     

提供yes和no比例的输出。将其存储在data.frame重复中   此过程1000次,将所有输出添加到提到的数据   帧:

run1 24/26    
run2 4/26
...
run999 13/26

我真的希望有人能告诉我这个开头,或相关的代码/参数/结构。

2 个答案:

答案 0 :(得分:0)

这就是你想要的吗

#Create empty output, for 10 iterations
same_group_list = replicate(10,0) 
diff_group_list = replicate(10,0)

for (j in 1:10){ #For 10 iterations

    df1 = data.frame(pair = rep(c(1:26),2), size = rnorm(52,5.4,1.89))

    #Sort by 'pair'
    df1 = df1[with(df1, order(pair)), ]

    #Assign a group based on if 'size' is > or < than mean(size)
    for (i in 1:nrow(df1)){
        if (df1$size[i] <= mean(df1$size)){ #Use 5.4 explicitly instead of mean(df1$size) if you want
            df1$Group[i] = -1
        } else {
            df1$Group[i] = 1
        }
    }

    df1$Group = as.numeric(df1$Group) #Convert to numeric
    output2 = tapply(df1$Group, df1$pair, mean) #Carry out groupwise mean
    diff_group_list[j] = sum(output2 == 0) #A mean of 0 means pair grouped with another group
    same_group_list[j] = length(output2) - diff_group_list[j] #Everything else is the same group
}
output = data.frame("Same groupout of 26" = same_group_list, "Different Group out of 26" = diff_group_list)

答案 1 :(得分:0)

我创建了一个并排的数据框,然后比较了哪些高于而不是5.4。然后比较对。将两个尺寸均大于5.4的对相加,然后将所有东西除以26。

数据框proportions显示每次运行的比例。

proportions <- data.frame(run = (1:1000), prop = rep(NA,1000))
for (i in 1:1000) {
  df = data.frame(pair = c(1:26), 
                  size1 = rnorm(26,5.4,1.89), 
                  size2 = rnorm(26,5.4,1.89)
                  )
  greaterPairs <- sum(df[,2] > 5.4 & df[,3]>5.4)
  proportions[i,2] = greaterPairs/26
}
head(proportions)

我没有将比例保留为字符串格式“18/26”,因为稍后,如果你想要总结它们遵循某些条件的总和,你将不得不在视觉上逐一进行。因此,例如,如果您想知道其中有多少大于或等于18/26:

sum(proportions$prop >= (18/26))