【问题标题】:Refer to list of variables in sum function in R请参阅 R 中 sum 函数中的变量列表
【发布时间】:2022-01-18 19:50:24
【问题描述】:

我有一个类似于以下示例的表:

Person Date VarA VarD VarC VarB
Erik 2020-12-31 5 7 3 12
Erik 2021-03-31 6 4 4 15
Simon 2020-12-31 9 8 5 17
Simon 2021-03-31 11 2 3 16

表中的变量数量可能会有所不同。我想创建一个通用的 R 脚本,可用于计算分子和分母中任意数量变量之和之间的比率。使用 {Var}、{P1} 和 {P2} 指定并包含在 R 脚本中的变量列表以及应在分子和分母中求和的变量列表(参见下面的代码)。

我写了以下代码:

#{Var} is replaced by a list of all variables, in this case "VarA, VarD, VarC, VarB"
Variablelist <- str_split("{Var}", ", ", simplify = TRUE)

#{P1} and {P2} are replaced by lists of the positions of the variables in Variablelist that should be included, for example "1, 3, 4"
NumeratorSum <- Variablelist[c({P1})]
DenominatorSum <- Variablelist[c({P2})]

InputDataSet <- InputDataSet %>%
  dplyr::rowwise() %>%
  dplyr::mutate(ResultRatio = sum(NumeratorSum, na.rm=TRUE) / sum(NumeratorSum, na.rm=TRUE))

OutputDataSet <- InputDataSet %>%
  dplyr::select(Person, Date, ResultRatio)

例如,如果 {P1}="1, 3, 4" 和 {P2}="2, 3" 那么 ResultRatio 应该等于 sum(VarA, VarC, VarB)/sum(VarD, VarC) .

但是,代码不起作用,我需要帮助来了解如何在 sum 函数中引用列表 NumeratorSum 和 DenominatorSum,以便对表中与这些列表中的元素同名的列求和。

【问题讨论】:

    标签: r vector sum


    【解决方案1】:

    假设 DF 是末尾注释中的输入数据帧,输入 v、P1 和 P2 如下所示,使用 rowSums。不使用任何包。

    v <- c("VarA", "VarB", "VarC", "VarD")
    P1 <- c(1, 3, 4)
    P2 <- 2:3
    rowSums(DF[v[P1]]) / rowSums(DF[v[P2]])
    ## [1] 1.0000000 0.7368421 1.0000000 0.8421053
    
    # check
    (DF$VarA + DF$VarC + DF$VarD) / (DF$VarB + DF$VarC)
    ## [1] 1.0000000 0.7368421 1.0000000 0.8421053
    

    如果 v、P1 和 P2 用逗号分隔的字符串表示 vs、p1s 和 p2s 则先使用扫描:

    vs <- "VarA, VarB, VarC, VarD"
    v <- scan(text = vs, what = "", quiet = TRUE, sep = ",", strip.white = TRUE)
    v
    ## [1] "VarA" "VarB" "VarC" "VarD"
    
    p1s <- "1, 3, 4"
    P1 <- scan(text = p1s, quiet = TRUE, sep = ",")
    P1
    ## [1] 1 3 4
    
    p2s <- "2, 3"
    P2 <- scan(text = p2s, quiet = TRUE, sep = ",")
    P2
    ## [1] 2 3
    

    注意

    DF <- 
    structure(list(Person = c("Erik", "Erik", "Simon", "Simon"), 
        Date = c("2020-12-31", "2021-03-31", "2020-12-31", "2021-03-31"
        ), VarA = c(5L, 6L, 9L, 11L), VarD = c(7L, 4L, 8L, 2L), VarC = c(3L, 
        4L, 5L, 3L), VarB = c(12L, 15L, 17L, 16L)), class = "data.frame", row.names = c(NA, 
    -4L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 2013-09-14
      • 1970-01-01
      相关资源
      最近更新 更多