【问题标题】:product of all columns in a data frame in RR中数据框中所有列的乘积
【发布时间】:2020-09-23 19:40:33
【问题描述】:

假设我有一个这样的数据框

aa = data.frame(x=c(1,2,3), y=c(1,1,1), z=c(3,2,1))

如何获得 dplyr 中所有列的成对乘积? 如果我知道数据框中的所有列名,那将是微不足道的。我只是调用一个常规的 mutate()

aa = aa %>%
 mutate(prod=x*y*z)

但假设我不知道列名和列数,那么获取所有列的乘积(所有列的成对相乘)的编程方式是什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用reduce*

    library(dplyr)
    library(purrr)
    aa %>% 
       mutate(prod = reduce(., `*`))
    

    -输出

    #  x y z prod
    #1 1 1 3    3
    #2 2 1 2    4
    #3 3 1 1    3
    

    或者使用pmapprod

    aa %>% 
        mutate(prod = pmap_dbl(., prod))
    

    或与base R 一起使用Reduce

    aa$prod <- Reduce(`*`, aa)
    

    【讨论】:

      【解决方案2】:

      另一种选择是使用c_across()

      library(dplyr)
      #Data
      aa = data.frame(x=c(1,2,3), y=c(1,1,1), z=c(3,2,1))
      #Code
      aa %>% mutate(id=1:n()) %>%
        rowwise(id) %>% mutate(product=prod(c_across(x:z)))
      

      输出:

      # A tibble: 3 x 5
      # Rowwise:  id
           id     x     y     z product
        <int> <dbl> <dbl> <dbl>   <dbl>
      1     1     1     1     3       3
      2     2     2     1     2       4
      3     3     3     1     1       3
      

      【讨论】:

        【解决方案3】:

        另一个使用 apply + prod 的基本 R 选项

        aa$prod <- apply(aa,1,prod)
        

        cumprod

        aa$prod <- unlist(tail(cumprod(as.data.frame(t(aa))),1))
        

        这样

        > aa
          x y z prod
        1 1 1 3    3
        2 2 1 2    4
        3 3 1 1    3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-29
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 2018-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多