【问题标题】:How to get the sum of rows using a vector and the make the result in a column如何使用向量获取行的总和并将结果放在列中
【发布时间】:2021-10-28 13:51:56
【问题描述】:

我有一个数据框,我想计算每行中向量中存在的变量的总和,并在我希望创建的新变量的名称来自向量中的变量名称之后,在其他变量中求和

例如

数据

Name      A_12    B_12    C_12   D_12    E_12
r1        1         5      12      21     15
r2        2         4       7      10      9
r3        5        15      16       9      6
r4        7         8       0       7     18

假设我有两个向量

vector_1 <- c("A_12","B_12","C_12")
vector_2 <- c("B_12","C_12","D_12","E_12")

我想要的结果是:

New_data >

 Name        A_12     B_12   C_12   ABC_12     D_12    E_12   BCDE_12
    r1        1         5     12      18         21     15      54
    r2        2         4      7      13         10      9      32
    r3        5        15     16      36          9      6      45
    r4        7         8      0      15          7     18      40

我创建了 for 循环来获取向量中行的总和,但我没有得到正确的结果 请告诉我,您需要更多信息或澄清 谢谢

【问题讨论】:

    标签: r row rowsum


    【解决方案1】:

    您可以使用rowSums 和简单的列子集:

    dat$ABC_12 <- rowSums(dat[,vector_1])
    dat$BCDE_12 <- rowSums(dat[,vector_2])
    dat
    #   Name A_12 B_12 C_12 D_12 E_12 ABC_12 BCDE_12
    # 1   r1    1    5   12   21   15     18      53
    # 2   r2    2    4    7   10    9     13      30
    # 3   r3    5   15   16    9    6     36      46
    # 4   r4    7    8    0    7   18     15      33
    

    请注意,如果您的框架继承自data.table,那么您需要使用subset(dat, select=vector_1)dat[,..vector_1] 而不是简单的dat[,vector_1];如果您还没有使用data.table,那么您可以放心地忽略这一段。

    【讨论】:

    • 感谢您的回答,唯一的问题是,我不知道向量的名称,因为它们是使用 for 循环生成的,所以我不知道如何获取名称制定我的变量总和的名称例如我应该得到每个变量的前 3 个字母来制定新变量的名称:例如 V1= M11T888 V2=M22T888 , V3=M33T888 新变量的名称应该是 M112233T888 这就是我需要的原因获取向量每个元素的前 3 个字母
    • 你认为可以假设它们都有一些共同的后缀吗?
    • 实际上,它们没有相同的后缀,因为某些主题具有完全相同的名称并带有额外的 _2,例如 M11T888 和 M11T888_2,我刚刚检查了我的数据并知道有一些像这样的变量
    • 您要求一种方法来组合未知列名,该方法使用已知易出错的仅演示启发式(即共享后缀),对吗?
    • 是的,而且我不知道向量的数量,因为它们是使用 for 循环生成的
    【解决方案2】:

    像这样(使用dplyr/tidyverse

    df %>% 
      rowwise() %>%
      mutate(
        ABC_12 = sum(c_across(vector_1)),
        BCDE_12 = sum(c_across(vector_2))
      )
    

    虽然我不确定您的示例中的总和是否正确

    -=-=-=编辑-=-=-=- 这是一个帮助命名的函数。

    ex_fun <- function(vec, n_len){
      paste0(paste(substr(vec,1,n_len), collapse = ""), substr(vec[1],n_len+1,nchar(vec[1])))
    }
    

    然后可以像这样实现。

    df %>% 
      rowwise() %>%
      mutate(
        !!ex_fun(vector_1, 1) := sum(c_across(vector_1)),
        !!ex_fun(vector_2, 1) := sum(c_across(vector_2)),
      )
    

    -=-= 补充说明-=--=

    如果你列出你的向量,你可以将它与 r2evans 的答案结合起来,如果你愿意,可以加入一个循环。

    vectors = list(vector_1, vector_2)
    
    for (v in vectors){
      df[ex_fun(v, 1)] <- rowSums(df[,v])
    }
    

    【讨论】:

    • 您好,谢谢您的回答,唯一的问题是,我不知道向量的名称,因为它们是使用 for 循环生成的,所以我不知道如何到达那里名称来制定我的变量总和例如我应该得到每个变量的前 3 个字母来制定新变量的名称:例如 V1= M11T888 V2=M22T888 , V3=M33T888 新变量的名称应该是 M112233T888 这就是为什么我需要获取向量每个元素的前 3 个字母
    • 已添加编辑,希望对您有所帮助
    【解决方案3】:

    我相信这可能有效,只要起始数字不同:

    library("tidyverse")
    
    #Input dataframe.
    data <- data.frame(Name =c("r1", "r2", "r3", "r4"), A_12 = c(1, 2, 5, 7), B_12 = c(5, 4, 15, 8),
               C_12 = c(12, 7, 16, 0), D_12 = c(21, 10, 9, 7), E_12 = c(15, 9, 6, 18))
    
    #add all vectors to the "vectors" list. I have added vector_1 and vector_2, but
    #there can be as many vectors as needed, they just need to be put in the list.
    vector_1 <- c("A_12","B_12","C_12")
    vector_2 <- c("B_12","C_12","D_12","E_12")
    
    vector_list<-list(vector_1, vector_2)
    
    vector_sum <- function(data, vector_list){
      output <- data |>
        dplyr::select(1, all_of(vector_list[[1]]))
      
      for (i in vector_list) {
        name1 <- substring(as.character(i), 1,1) |> paste(collapse = '')
        name2 <- substring(as.character(i[1]), 2)
        
        input_temp <- dplyr::select(data, all_of(i))
        input_temp <- mutate(input_temp, temp=rowSums(input_temp))
        names(input_temp)[names(input_temp) == "temp"] <- paste(name1, name2)
        
        output = cbind(output, input_temp)
      }
      
      output[, !duplicated(colnames(output))]
    }
    
    
    vector_sum(data, vector_list)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多