R:数据帧操作

时间:2014-01-13 08:18:14

标签: r dataframe

我有两个数据框:

>df1
type  id1  id2  id3  count1  count2  count3
a     x1   y1   z1   10      20      0
b     x2   y2   z2   20      0       30
c     x3   y3   z3   10      10      10

>df2
id   prop
x1   10
x2   5
x3   100
y1   0
y2   50
y3   80
z1   10
z2   20
z3   30

count*就像权重一样。所以,最后我想加入表格,TotalProp是道具和计数的加权和

例如对于df1 TotalProp = 10(prop for x1) * 10(count1) + 0(Prop for y1) * 20(count2) + 10(Prop for z1) * 0(count3) = 100

中的第一行

因此我的决赛桌看起来像这样:

>result
type  id1  id2  id3  TotalProp
a     x1   y1   z1   100
b     x2   y2   z2   700
c     x3   y3   z3   2100

知道我该怎么办?

感谢。

3 个答案:

答案 0 :(得分:1)

首先使用一行解决方案,然后使用多个步骤进行说明

df1
##   type id1 id2 id3 count1 count2 count3
## 1    a  x1  y1  z1     10     20      0
## 2    b  x2  y2  z2     20      0     30
## 3    c  x3  y3  z3     10     10     10


df2
##    id prop
## x1 x1   10
## x2 x2    5
## x3 x3  100
## y1 y1    0
## y2 y2   50
## y3 y3   80
## z1 z1   10
## z2 z2   20
## z3 z3   30

rownames(df2) <- df2$id

result <- data.frame(type = df1$type, TotalProp = rowSums(matrix(df2[unlist(df1[, c("id1", "id2", "id3")]), "prop"], nrow = nrow(df1)) * as.matrix(df1[, 
    c("count1", "count2", "count3")])))

result
##   type TotalProp
## 1    a       100
## 2    b       700
## 3    c      2100

逐步解释

首先,我们在向量中获取所有id值,我们要从df2

获取相应的道具值

第1步

unlist(df1[, c("id1", "id2", "id3")])
## id11 id12 id13 id21 id22 id23 id31 id32 id33 
## "x1" "x2" "x3" "y1" "y2" "y3" "z1" "z2" "z3" 

第2步

我们将df2的行命名为df2$id。     rownames(df2)&lt; - df2 $ id

第3步 然后使用步骤1中的结果,我们得到相应的prop

df2[unlist(df1[, c("id1", "id2", "id3")]), "prop"]
## [1]  10   5 100   0  50  80  10  20  30

第4步 将步骤3中的向量转换回二维形式

matrix(df2[unlist(df1[, c("id1", "id2", "id3")]), "prop"], nrow = nrow(df1))
##      [,1] [,2] [,3]
## [1,]   10    0   10
## [2,]    5   50   20
## [3,]  100   80   30

第5步 将步骤4的结果与来自counts

df1相乘
as.matrix(df1[, c("count1", "count2", "count3")])
##      count1 count2 count3
## [1,]     10     20      0
## [2,]     20      0     30
## [3,]     10     10     10

matrix(df2[unlist(df1[, c("id1", "id2", "id3")]), "prop"], nrow = nrow(df1)) * 
       as.matrix(df1[, c("count1", "count2", "count3")])
##      count1 count2 count3
## [1,]    100      0      0
## [2,]    100      0    600
## [3,]   1000    800    300

第6步

rowSums应用于第5步的结果,以获得所需的TotalProp

rowSums(matrix(df2[unlist(df1[,c('id1','id2','id3')]),'prop'], nrow=nrow(df1)) * as.matrix(df1[,c('count1', 'count2', 'count3')]))

## [1]  100  700 2100

答案 1 :(得分:0)

我的解决方案依赖于数据结构,因此它不是通用的,而是简短的。

m1 <- matrix(df[, tail(names(df1), 3)])
m2 <- matrix(df2$prop, 3)
rowSums(m1 * m2)
[1]  100  700 2100

它不使用任何ID,所以要小心!

答案 2 :(得分:0)

另一种方式......

TotalProp <- apply(df1,1,function(x) {
  sapply(x[2:4],function(x)df2[df2$id==x,]$prop) %*% as.numeric(x[5:7])
})
result    <- cbind(df1[1:4],TotalProp)

%*%是内部产品运算符,就像rowsum一样,所以这有点像@ ChinmayPatil的答案。所以步骤是:

  1. 对于df1中的每一行,提取df2的{​​{1}} = cols 2:4 id
  2. 的元素
  3. df1
  4. 的cols 5:7形成的向量形成1的向量的内积
  5. df1 [df1]
  6. 的每一行重复上述步骤