【问题标题】:Multiplying column names/factors by each row每行乘以列名/因子
【发布时间】:2016-06-14 15:53:29
【问题描述】:

您好,我是 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),]

但这似乎不对。

【问题讨论】:

    标签: r


    【解决方案1】:

    一个标准的方法是:把你的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 的形式手动写出表达式(如在其他一些答案中)不会很好地扩展到其他成绩或修改与每个成绩相关的值。

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        使用 dplyr/tidyr:

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

        【讨论】:

          【解决方案4】:

          使用data.table 方法的简单快速的解决方案

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-16
            • 2018-07-21
            • 1970-01-01
            • 2020-12-27
            • 2018-01-03
            • 1970-01-01
            相关资源
            最近更新 更多