每行乘以列名称/因子

时间:2016-06-14 15:53:29

标签: r

嗨,我是R的新手,我有第一个问题,

我基本上有一个看起来非常相似的数据结构:

ID <- c(1,2,3)
C <- c(0.4,0.4,0.2)
B <- c(0.4,0.3,0.2)
A <- c(0.2,0.3,0.6)
df <- data.frame(ID,A,B,C)

head(df)

  ID   A   B   C
1  1 0.2 0.4 0.4
2  2 0.3 0.3 0.4
3  3 0.6 0.2 0.2

其中A,B,C对应于等级A = 1,B = 2,C = 3

我想计算每一行的加权平均列,如:

ID 1   A*0.2 + B*0.4 + C*0.4
...

我试过了:

as.numeric(as.character(names(df[,2:ncol(df)]))) * df[2:nrow(df),]

但这似乎不对。

4 个答案:

答案 0 :(得分:3)

标准方法是:将您的thingamabob放入对象

grades = c(A=1,B=2,C=3)

然后map-reduce

df$wt_grade = Reduce(`+`, Map(`*`, df[names(grades)], grades))
# or
df$wt_grade = Reduce(`+`, lapply(names(grades), function(x) df[[x]] * grades[x]))

后一种方法borrowed from @eddi非常快。

根据A,B和C手动写出表达式(如在其他一些答案中),不能很好地扩展到其他成绩或修改与每个成绩相关的值。

答案 1 :(得分:2)

这样的东西?

df$WtAvg = with(df, A + 2*B + 3*C)

df
  ID   A   B   C WtAvg
1  1 0.2 0.4 0.4   2.2
2  2 0.3 0.3 0.4   2.1
3  3 0.6 0.2 0.2   1.6

答案 2 :(得分:0)

使用dplyr / tidyr:

library(dplyr)
library(tidyr)
df %>%
  gather(grade, value, -ID) %>%
  group_by(ID) %>%
  summarize(WtAvg = sum(as.numeric(grade) * value))

答案 3 :(得分:0)

使用data.table方法

的简单快速解决方案
library(data.table)

setDT(df)[, w_avg :=  (A + B*2 + C*3)/(A+B+C) ]