【问题标题】:using lapply for a function on a matrix with columns as elements in R将 lapply 用于矩阵上的函数,其中列作为 R 中的元素
【发布时间】:2021-09-18 14:48:24
【问题描述】:

我还是 R 新手,所以如果这是基本问题,请原谅。 我有以下数据框:

df <- data.frame(a=c(2,4,6,8), x = c(1,0,0,0), y=c(0,1,0,0), z=c(0,0,0,1))

> df
  a x y z
1 2 1 0 0
2 4 0 1 0
3 6 0 0 0
4 8 0 0 1

我将函数 sumfunc 定义为

sumfunc <- function(a,x,y,z){a*2+x+y-z}

所以每一行都有输入 a、x、y、z,我期待一个包含 4 个元素的向量。

  • 元素 1 = 5 (2*2+1+0-0)
  • 元素 2 = 9 (4*2+0+1-0)
  • 元素 3 = 12(6*2+0+0-0)
  • 元素 4 = 15 (8*2+0+0-1)

我尝试过使用

abc <- lapply(df$a, FUN=sumfunc, x=df$x, y=df$y, z=df$z)

但这并没有给我想要的输出。请建议应用家庭功能适合我的用例。
非常感谢!

【问题讨论】:

    标签: r apply lapply purrr


    【解决方案1】:

    这里有几种方法。你不需要apply,因为 R 是矢量化的:

    with(df, a*2+x+y-z)
    # [1]  5  9 12 15
    
    with(df, sumfunc(a,x,y,z))
    # [1]  5  9 12 15
    

    如果你真的想用apply):

    apply(df, 1, function(x) sumfunc(x[1], x[2], x[3], x[4]))
    # [1]  5  9 12 15
    

    【讨论】:

      【解决方案2】:

      这是使用mapply的好时机:

      mapply(sumfunc, df$a, df$x, df$y, df$z)
      # [1]  5  9 12 15
      

      如果您想以编程方式使用它,并且列名更改或参数数量变化,那么您也可以这样使用它:

      do.call(mapply, c(list(FUN=sumfunc), df))
      # [1]  5  9 12 15
      

      【讨论】:

        【解决方案3】:

        我们可以使用pmap

        library(purrr)
        pmap_dbl(df, sumfunc)
        [1]  5  9 12 15
        

        或者可以Vectorize这个函数使用do.call

        do.call(Vectorize(sumfunc), df)
        [1]  5  9 12 15
        

        【讨论】:

          【解决方案4】:

          如果你想在这里保留 data.frame 一个简单的解决方案

          library(dplyr)
          
          df %>% 
            mutate(sum = sumfunc(a,x,y,z))
          
            a x y z sum
          1 2 1 0 0   5
          2 4 0 1 0   9
          3 6 0 0 0  12
          4 8 0 0 1  15
          

          并返回单个向量

          df %>% 
            mutate(sum = sumfunc(a,x,y,z)) %>% 
            pull(sum)
          
          [1]  5  9 12 15
          

          【讨论】:

            【解决方案5】:

            我想我找到并回答了,虽然我不确定这是否是最合适的方式

            abc <- apply(X=as.data.frame(df$a), MARGIN=2, FUN=sumfunc, x=df$x,y=df$y, z=df$z)
            

            【讨论】:

              【解决方案6】:

              这是另一个简单的解决方案:

              library(purrr)
              
              exec(sumfunc, !!!df)
              
              [1]  5  9 12 15
              

              【讨论】:

                猜你喜欢
                • 2021-09-13
                • 1970-01-01
                • 2017-09-24
                • 1970-01-01
                • 2022-08-04
                • 1970-01-01
                • 1970-01-01
                • 2020-04-10
                • 2015-05-08
                相关资源
                最近更新 更多