首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据单元格值删除列的列

根据单元格值删除列的列
EN

Stack Overflow用户
提问于 2013-11-22 14:44:47
回答 2查看 2.6K关注 0票数 1

我有一个数据框架,大约有20,000个观测结果。由此,我创建了一个包含两个变量频率的应急表。

有了这个,我想执行一个独立的x平方检验,看看我的两个变量之间是否有关系。通常这很容易,但许多单元格的期望值为0,尽管原始数据帧的大小很大。我想删除任何包含频率小于5的行。

我已经对堆栈交换进行了广泛的搜索,但是我无法找到解决这个特定问题的方法,我要么理解(我对R比较陌生),要么找到一个使用应变表(而不是原始数据框架)的解决方案。

任何帮助都非常感谢。

编辑:

谢谢你的回应贾斯汀。

根据要求,我已经上传了数据表和应急表的摘录。我还上传了我迄今尝试过的少量代码,并给出了结果。

达菲

代码语言:javascript
复制
Department Super
AAP     1
ACS     4
ACE     1
AMA     1
APS     3
APS     2
APS     1
APS     1
ARC     5
ARC     7
ARC     1
BIB     6
BIB     6
BMS     2

所以有两列,第一列是三个字母的部门代码,第二列是一个数字整数(1-7)。

应急表

代码语言:javascript
复制
table(department,super)

        1    2   3   4   5   6   7   8
ACS     32  10   7  24  50   7  24  14
AMA      0   4   2   6  10   3  11   1
...

所以有频率的标准应急表。

到目前为止,我知道我可以创建一个逻辑测试,用于测试单元格内容是否小于5:

代码语言:javascript
复制
depSupCrosstab <- depSupCrosstab[,2:8]>5

我不知道的是如何使用这一行代码创建的矩阵来删除整行,如果它们有任何错误的条目。

希望这能有所帮助。恐怕我是新来的,但只有一种方法可以学习.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-22 16:18:12

我想我在一个相关的问题中找到了答案。在这种情况下,apply是您的朋友,因为它可以在cols或行上迭代。

要创建与您类似的数据框架,然后只选择所有cols都> 5的行,可以使用以下方法:

代码语言:javascript
复制
set.seed(1985)
tosub <- data.frame(matrix(round(runif(n = 80, min = 0, max = 100)), ncol = 8))
head(tosub,2)
x <- apply(tosub[,1:8] > 5, MARGIN = 1, all)
summary(x)
tosub[which(x),]

   X1 X2 X3 X4 X5 X6 X7 X8
1  66 30 72 59 26 69 76 47
2  27 42 26 95 66 14 67 18
4  42 28 93  7 35 35 95 23
5  38 89 69 91 98 91 60 69
9  89 31 91 72 28 31 58 58
10 53 87 27 89 95 37 98 20
票数 0
EN

Stack Overflow用户

发布于 2013-11-22 16:58:27

恐怕你的问题更复杂。卡方检验的假设是,每个单元的期望频率大于5。在您的示例中,您正在尝试选择列联表中每个单元格的计数,即观测频率。预期频率(在空假设下)是根据行和列总数计算的,如基本示例这里所示。

为了遵循您的示例,假设的偶然性表可能如下所示:

代码语言:javascript
复制
ACS <- c(32, 10, 7, 24, 50, 7, 24, 14)
AMA <- c(0, 4, 2, 6, 10, 3, 11, 1)
ARC <- c(6, 10, 12, 3, 12, 23, 10, 2)

tab <- rbind(ACS, AMA, ARC)

如果您筛选所观察到的计数等于或小于5,您将删除AMA和ARC:

代码语言:javascript
复制
apply(tab,1, function(x) any(x<=5))

  ACS   AMA   ARC 
FALSE  TRUE  TRUE 

,这在概念上是错误的,,因为如上所述,预期的频率取决于整个数据。以获得经验。计数:

代码语言:javascript
复制
chisq.test(tab, correct=F)$expected

         [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
ACS 22.558304 14.247350 12.466431 19.590106 42.742049 19.590106 26.713781
AMA  4.968198  3.137809  2.745583  4.314488  9.413428  4.314488  5.883392
ARC 10.473498  6.614841  5.787986  9.095406 19.844523  9.095406 12.402827
         [,8]
ACS 10.091873
AMA  2.222615
ARC  4.685512

Warning message:
In chisq.test(tab, correct = F): Chi-squared approximation may be incorrect

卡方测试发出警告信息,因为确实有一些带有exp的单元格。但是,如果只删除AMA,表的动态(行和列总计)和所有exp都会发生变化。计数在5以上:

代码语言:javascript
复制
chisq.test(tab[-2,], correct=F)$expected

        [,1]      [,2]     [,3]      [,4]     [,5]      [,6]     [,7]
ACS 25.95122 13.658537 12.97561 18.439024 42.34146 20.487805 23.21951
ARC 12.04878  6.341463  6.02439  8.560976 19.65854  9.512195 10.78049
         [,8]
ACS 10.926829
ARC  5.073171

因此,如果您同时删除AMA和ARC,您将失去一个重要的信息。

您可以尝试运行Fisher的确切测试(请参阅下面的解释):

代码语言:javascript
复制
fisher.test(tab,simulate.p.value=TRUE,B=10000)

最后:

  1. 观察到的个别频率对预期频率的指示很差。观察到的频率可能低于5,但该细胞的预期频率将高于5。
  2. 在大型应急表中,至多拥有20%的exp是可以接受的。频率低于5,但结果是统计功率的损失,因此测试可能无法检测到真正的效果。即使在这种情况下,经验。频率不应该低于1。
  3. 一种用于低exp的替代测试。频率是Fisher的精确测试。卡方检验统计量近似于卡方分布.如果样本大小很大,这种近似就会变得更精确,因此对exp的要求也就更高了。频率> 5。费舍尔精确检验即使在样本规模小的情况下也能计算出卡方统计量的精确概率,但它在计算上可能比较密集。不幸的是,对于大于2x2的应急表,您可能需要模拟p值,它有其自身的局限性(这里没有讨论它的空间,但它是一个很好的研究主题)。选择大量的复制以进行模拟(B),并对其进行调整以查看您的解决方案有多健壮。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20147589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档