削减具有部分重叠信息的阵列

时间:2012-10-04 15:11:48

标签: r match

问题:
使用R,我有两个数组,两个数据都具有相同类型的数据(例如,相同的行,列和/或层名称)。但是,它们具有不同的尺寸。排&列名称部分重叠。也就是说,大多数级别的行和列因子都出现在两个数组中,但有些因素对每个数组都是唯一的。我想采取其中一个阵列,并将其削减,以便它只包含行和&两个数组共有的列级别。我之前已经能够通过编写我自己非常复杂的函数来实现这一点,但看起来这应该是一个简单的操作。任何人都可以指出我正确的方向吗?

以下是我认为实现此目的的一种不必要的费力方式的示例代码。在这种情况下,sp.ixn.core是一个较小的2D数组,我想削减一个3D数组,所以行和列匹配sp.ixn.core ...最后一点是我仔细检查以查看数字加起来正确。

temp=table(data$plant,data$Species,data$jdate)
temp2=array(,dim=c(nrow(sp.ixn.core),ncol(temp),dim(temp)[3]))

for (i in 1:length(rownames(sp.ixn.core))){
temp2[i,,] = temp[rownames(temp) == rownames(sp.ixn.core)[i],,]
}

colnames(temp2) = colnames(temp)
temp3=array(,dim=c(nrow(sp.ixn.core),ncol(sp.ixn.core),dim(temp)[3]))
for (i in 1:length(colnames(sp.ixn.core))){
temp3[,i,] = temp2[,colnames(temp2) == colnames(sp.ixn.core)[i],]
}
dim(temp3)

sp.ixn.core.tbl = temp3
dimnames(sp.ixn.core.tbl)[[3]] = dimnames(temp)[[3]]
dimnames(sp.ixn.core.tbl)[[2]] = colnames(sp.ixn.core)
dimnames(sp.ixn.core.tbl)[[1]] = rownames(sp.ixn.core)
dimnames(sp.ixn.core.tbl)

for (i in 1:nrow(sp.ixn.core)){
    if (sum(sp.ixn.core.tbl[i,,]) == rowSums(sp.ixn.core)[i])
        print("yes")
}

for (i in 1:ncol(sp.ixn.core)){
    if (sum(sp.ixn.core.tbl[,i,]) == colSums(sp.ixn.core)[i])
        print("yes")
}

1 个答案:

答案 0 :(得分:0)

我想你可能只需要:

newtemp <- temp[ rownames(temp) %in% rownames(sp.ixn.core),
                 colnames(temp) %in% colnames(sp.ixn.core),
                 dimnames(temp)[3] %in% dimnames(sp.ixn.core)[3] ]

你可能刚刚使用'dimnames',因为dimnames(x)[1] == rownames(x)。正如nograpes所建议的那样,更好地针对您的实际数据对象进行测试。我有点担心你的表调用可能会返回一个带有NULL dimnames的对象。