根据其他列中的值计算dataframe中的值之和

根据其他列中的值计算dataframe中的值之和,r,dataframe,statistics,rows,rowsum,R,Dataframe,Statistics,Rows,Rowsum,我在R中有一个数据框,其中的值对应于估计值及其误差幅度(MoE) 列名由一个模式、一个指示字符(e=估计值,m=误差幅度)和一个与估计值和误差幅度匹配的ID组成。 因此,列名看起来像“XXXe1,XXXm1,XXXe2,XXXm2,…” 目标 我正在尝试创建一个函数来(针对每一行) 计算估算值之和。(这很简单。) 计算累计误差。这是每个MoE平方和的平方根 条件:标记为0的估计MoE只能添加一次 示例: 在第20行中,聚合MoE应仅为sqrt(123^2) 在第13行中,B01001e4和B0

我在R中有一个数据框,其中的值对应于估计值及其误差幅度(MoE)

列名由一个模式、一个指示字符(e=估计值,m=误差幅度)和一个与估计值和误差幅度匹配的ID组成。
因此,列名看起来像“XXXe1,XXXm1,XXXe2,XXXm2,…”

目标 我正在尝试创建一个函数来(针对每一行)

  • 计算估算值之和。(这很简单。)

  • 计算累计误差。这是每个MoE平方和的平方根

  • 条件:标记为0的估计MoE只能添加一次

  • 示例:

    • 在第20行中,聚合MoE应仅为
      sqrt(123^2)
    • 在第13行中,B01001e4和B01001e5为0,因此它们的MoE只计算一次
    到目前为止,我已经做了以下工作来构建一个函数:

    estimate_aggregator <- function(DF_to_write_on, New_column_name, source_df, pattern){
    
      subset_df <- source_df[, grepl(pattern, names(source_df))] # I subset all the columns named with the pattern, regardless of whether they are estimate or margin of error
      subset_df_e <- source_df[, grepl(paste0(pattern, "e"), names(source_df))] # I create a table with only the estimated values to perform the sum
    
      DF_to_write_on[paste0(New_column_name, "_e")]<- rowSums(subset_df_e) # I write a new column in the new DF with the rowSums of the estimates values, having calculated the new estimate
    
      return(DF)
    }
    

    从您的描述来看,您想要的输出应该有两列,估计值的行和,以及使用您描述的逻辑的错误行边距的函数。这里有一个(有点迂回)解决这个问题的方法

    我将您的数据保存为
    df

    # Isolate estimate and MoE dataframes
    df_e <- df[,grepl('e', names(df))]
    df_m <- df[,grepl('m', names(df))]
    
    # Temporary matrix used to isolate 0 values for MoE, count number of zero occurances, and convert those MoE values to NA
    mat <- df_e == 0
    mat <- t(apply(mat, 1, cumsum))
    df_m[mat > 1] = NA
    
    
    # Combine with estimate row sum
    output_df <- data.frame(
      e = rowSums(df[,grepl('e', names(df))]),
      m = apply(df_m, 1, function(x) sqrt(sum(x^2, na.rm = T)))
    )
    
    head(output_df)
         e        m
    1 2508 382.4173
    2 3608 637.5061
    3 1564 358.5178
    4 3584 380.3512
    5 1436 320.9595
    6 3440 651.4031
    
    #隔离估计和MoE数据帧
    
    df_e您能显示预期的输出吗?当然可以now@akrun我指定了函数应该执行以写入新值的期望结果。这够了吗?让我知道!您的最终输出是否应该有两列,每行有一个估计值和MoE?您的代码中有一个小错误:
    mat 1]=NA
    也会导致丢弃两个零后的估计值,
    c(1,2,0,0,3)
    将只计算前3个对应的边距。我将使用
    df_m[df_e!=0|t(!apply(df_e,1,复制))]@EmilBode和astrofunkswag,我正在尝试运行此代码(使用Emil建议的更改,将这两行替换为一行)。结果df_m似乎是一个具有NA值或123的矩阵。这意味着在最后一列中写入的聚合MoE仅基于值123。例如,没有0值(或没有MoE值=123)的行的聚合MoE为0,而不是平方和的sqrt。您可能需要我展示我所做的功能,我如何与您共享它?//圣诞快乐!我错了!我将所有有效值设置为NA,而不是无效值,并且没有测试我的代码<代码>df_m[df_e==0|t(应用(df_e,1,重复))]现在它有意义了。非常感谢。只是一个小小的警告:如果您只想设置为具有估计值(
    df_e==0
    )且重复的NA值,那么应该使用AND
    &
    运算符,而不是
    (即OR)。所以:
    df_m[df_e==0&t(应用(df_e,1,重复))]
    
    structure(list(B01001e1 = c(1691L, 2103L, 975L, 2404L, 866L, 
    2140L, 965L, 727L, 1602L, 1741L, 948L, 1771L, 1195L, 1072L, 566L, 
    1521L, 2950L, 770L, 1624L, 0L), B01001m1 = c(337L, 530L, 299L, 
    333L, 264L, 574L, 227L, 266L, 528L, 498L, 320L, 414L, 350L, 385L, 
    176L, 418L, 672L, 226L, 319L, 123L), B01001e2 = c(721L, 1191L, 
    487L, 1015L, 461L, 1059L, 485L, 346L, 777L, 857L, 390L, 809L, 
    599L, 601L, 371L, 783L, 1215L, 372L, 871L, 0L), B01001m2 = c(173L, 
    312L, 181L, 167L, 170L, 286L, 127L, 149L, 279L, 281L, 152L, 179L, 
    193L, 250L, 117L, 234L, 263L, 155L, 211L, 123L), B01001e3 = c(21L, 
    96L, 70L, 28L, 33L, 90L, 12L, 0L, 168L, 97L, 72L, 10L, 59L, 66L, 
    14L, 0L, 35L, 47L, 14L, 0L), B01001m3 = c(25L, 71L, 73L, 26L, 
    33L, 79L, 18L, 123L, 114L, 79L, 59L, 15L, 68L, 99L, 22L, 123L, 
    31L, 37L, 20L, 123L), B01001e4 = c(30L, 174L, 25L, 91L, 4L, 27L, 
    30L, 43L, 102L, 66L, 54L, 85L, 0L, 16L, 0L, 26L, 34L, 27L, 18L, 
    0L), B01001m4 = c(26L, 148L, 30L, 62L, 9L, 27L, 25L, 44L, 82L, 
    52L, 46L, 48L, 123L, 21L, 123L, 40L, 33L, 32L, 27L, 123L), B01001e5 = c(45L, 
    44L, 7L, 46L, 72L, 124L, 45L, 34L, 86L, 97L, 0L, 83L, 0L, 30L, 
    0L, 66L, 0L, 23L, 33L, 0L), B01001m5 = c(38L, 35L, 12L, 37L, 
    57L, 78L, 36L, 37L, 62L, 97L, 123L, 50L, 123L, 42L, 123L, 59L, 
    123L, 31L, 49L, 123L)), .Names = c("B01001e1", "B01001m1", "B01001e2", 
    "B01001m2", "B01001e3", "B01001m3", "B01001e4", "B01001m4", "B01001e5", 
    "B01001m5"), row.names = c(NA, 20L), class = "data.frame")
    
    # Isolate estimate and MoE dataframes
    df_e <- df[,grepl('e', names(df))]
    df_m <- df[,grepl('m', names(df))]
    
    # Temporary matrix used to isolate 0 values for MoE, count number of zero occurances, and convert those MoE values to NA
    mat <- df_e == 0
    mat <- t(apply(mat, 1, cumsum))
    df_m[mat > 1] = NA
    
    
    # Combine with estimate row sum
    output_df <- data.frame(
      e = rowSums(df[,grepl('e', names(df))]),
      m = apply(df_m, 1, function(x) sqrt(sum(x^2, na.rm = T)))
    )
    
    head(output_df)
         e        m
    1 2508 382.4173
    2 3608 637.5061
    3 1564 358.5178
    4 3584 380.3512
    5 1436 320.9595
    6 3440 651.4031