如何识别属于表中单元格的行[r]

时间:2015-01-08 02:04:19

标签: r crosstab

考虑以下示例,

>data(CO2)
>xtabs(~Plant+Type+Treatment,CO2)
, , Treatment = nonchilled

     Type
Plant Quebec Mississippi
  Qn1      7           0
  Qn2      7           0
  Qn3      7           0
  Qc1      0           0
  Qc3      0           0
  Qc2      0           0
  Mn3      0           7
  Mn2      0           7
  Mn1      0           7
  Mc2      0           0
  Mc3      0           0
  Mc1      0           0

, , Treatment = chilled

     Type
Plant Quebec Mississippi
  Qn1      0           0
  Qn2      0           0
  Qn3      0           0
  Qc1      7           0
  Qc3      7           0
  Qc2      7           0
  Mn3      0           0
  Mn2      0           0
  Mn1      0           0
  Mc2      0           7
  Mc3      0           7
  Mc1      0           7

我需要遍历此表中的每个非零单元格,识别属于所考虑的单元格的CO2的行号,并对它们执行某些操作。 例如,我需要确定CO2中的哪7行属于Qn1,魁北克和非冷却,然后对它们执行某些操作,然后转到Qn2,魁北克和非冷却等。

我需要一种方法来识别属于单元格的数据集的行号。

显然,我可以with(CO2, which(Treatment==xxx&Type==yyy&Plant==zzz))并循环遍历各种因子级别。但这根本不优雅,更不用说它将循环通过表格中的空单元格。

3 个答案:

答案 0 :(得分:2)

不确定您想要的确切输出,但是这个怎么样?:

test <- xtabs(~Plant+Type+Treatment,CO2)
result <- data.frame(which(test != 0, arr.ind=TRUE))
result

#    Plant Type Treatment
#Qn1     1    1         1
#Qn2     2    1         1
#Qn3     3    1         1
#Mn3     7    2         1
# etc

如果你想要植物/类型/治疗的名称,你可以这样做:

result[] <- Map(function(x,y) y[x], result, dimnames(test))
result

#    Plant        Type  Treatment
#Qn1   Qn1      Quebec nonchilled
#Qn2   Qn2      Quebec nonchilled
#Qn3   Qn3      Quebec nonchilled
#Mn3   Mn3 Mississippi nonchilled
# etc

答案 1 :(得分:1)

不知道为什么我之前没有想到这个:

id=1:nrow(CO2)
solution=aggregate(id~Plant+Type+Treatment,CO2,c)

欢迎任何其他创新解决方案。

答案 2 :(得分:1)

您也可以使用split。结果将是一个“矩阵”,其中“row.names”作为唯一标识符

do.call(rbind,split(1:nrow(CO2),interaction(CO2[1:3]),drop=TRUE))