考虑以下示例,
>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))
并循环遍历各种因子级别。但这根本不优雅,更不用说它将循环通过表格中的空单元格。
答案 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))