嗨,我是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),]
但这似乎不对。
答案 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) ]