如何将来自数据帧的一行的EACH值与来自另一个数据帧的行的所有值相乘

时间:2013-12-24 20:46:38

标签: r dataframe

我有两个数据框:

species = c ('A. alba', 'P. nigra', 'P.sylv', 'C. sativa', 'B. Pendula', 'Q. cerris', 'Q. petrae', 'Q. pubesc', 'P. alba', 'T. arvense')
speciesdat <- data.frame(pointID= species,matrix(runif(100),ncol=10,))

speciesdat

A. alba     0.43768279  0.70788388  0.22385977  0.4865352   0.65390645  0.6131476   0.9034217   0.9882588   0.045676450 0.1109551
P. nigra    0.23841748  0.10107243  0.31643354  0.9124586   0.17680009  0.5730999   0.3687399   0.6710573   0.424592606 0.9963007
P.sylv      0.03510202  0.66443096  0.56751081  0.2605511   0.27068835  0.3625468   0.6825015   0.6128847   0.394236153 0.9825921
C. sativa   0.83156640  0.87620244  0.28547281  0.6186353   0.03054993  0.6602586   0.7266206   0.5757858   0.044838758 0.9264902
B. Pendula  0.02853235  0.11147283  0.65968549  0.6087475   0.01859563  0.7705008   0.2588491   0.6160338   0.278875411 0.3760177
Q. cerris   0.33518206  0.66494652  0.44535126  0.6396948   0.84853701  0.8528920   0.9083867   0.3406821   0.301699912 0.7552817
Q. petrae   0.99028047  0.32606149  0.03991465  0.4070295   0.76723652  0.1510258   0.4583800   0.9209462   0.372419649 0.4774647
Q. pubesc   0.48350520  0.02714703  0.84217131  0.7785254   0.59770557  0.8242108   0.3781278   0.2444586   0.997081622 0.5707966
P. alba     0.32207762  0.17842972  0.72346310  0.2024601   0.04296549  0.7129133   0.7596528   0.1445458   0.009422524 0.9234416
T. arvense  0.46029757  0.72158301  0.35532973  0.8191271   0.85785606  0.1145541   0.7022644   0.9689575   0.524823767 0.9510237


veges = data.frame(pointID = species, matrix(runif(80), ncol=8))
veges

A. alba     0.8760049   0.08377138  0.7947616   0.15866494  0.94725913  0.4210001   0.75813441  0.03543249
P. nigra    0.5990935   0.26900508  0.6619769   0.02748618  0.06831557  0.0331052   0.74318637  0.48573950
P.sylv      0.7159880   0.84181724  0.6723000   0.52288279  0.17646907  0.7342308   0.32012234  0.12942797
C. sativa   0.1593788   0.41923564  0.6169959   0.87120304  0.51923185  0.7643932   0.15112887  0.38999869
B. Pendula  0.6589521   0.28458623  0.9378560   0.46504735  0.37802398  0.8599706   0.42625633  0.04834509
Q. cerris   0.6500326   0.33385627  0.7024338   0.11463147  0.95834461  0.9884738   0.67196514  0.47536082
Q. petrae   0.5767072   0.93077964  0.3999803   0.32463310  0.84351953  0.3218898   0.82015985  0.42689436
Q. pubesc   0.1727690   0.69179797  0.9994009   0.96287250  0.12937430  0.1530379   0.06389051  0.29790681
P. alba    0.7412723    0.74790322  0.6776089   0.92737920  0.44920139  0.9513559   0.84576046  0.22779249
T. arvense  0.6501236   0.05703468  0.2437144   0.13148191  0.40202796  0.8761405   0.53510479  0.86338306

数据框speciesdat包含物种存在于一个细胞中的可能性。

我想要做的是将每个物种,每个单元格的每个值(speciesdat)与veges的值相乘,并创建一个包含此结果的新数据框。

我该如何进行此计算?

1 个答案:

答案 0 :(得分:2)

一个较小的例子:

species <- LETTERS[1:3]
speciesdat <- data.frame(pointID=species, matrix(1:9, ncol=3))
veges <- data.frame(pointID=species, matrix(10*(1:6), ncol=2))
speciesdat
##   pointID X1 X2 X3
## 1       A  1  4  7
## 2       B  2  5  8
## 3       C  3  6  9
veges
##   pointID X1 X2
## 1       A 10 40
## 2       B 20 50
## 3       C 30 60
可以使用

outer进行操作。此函数将采用向量,将其拆分为两个,并返回外部产品:

f <- function(x, len) { outer(x[seq(len)], x[-seq(len)])}

以下是通过在合并数据上调用上述函数来检索的扩展列:

m <- merge(speciesdat, veges, by='pointID')
t(apply(m[-1], 1, f, ncol(speciesdat)-1))

使用cbind在第一列中添加:

x <- cbind(m[1], t(apply(m[-1], 1, f, ncol(speciesdat)-1)))
x
##   pointID  1   2   3   4   5   6
## 1       A 10  40  70  40 160 280
## 2       B 40 100 160 100 250 400
## 3       C 90 180 270 180 360 540

要获取评论中要求的姓名,请再次使用outer进行计算:

n <- c('pointID',  outer(names(speciesdat[-1]), names(veges[-1]), FUN=paste, sep='-'))
n
## [1] "pointID" "X1-X1"   "X2-X1"   "X3-X1"   "X1-X2"   "X2-X2"   "X3-X2"  

可以为这些分配上述结构的名称:

names(x) <- n

请注意,订单不在评论中,但对于此示例中的操作是正确的。