【问题标题】:How to do sapply to several columns in data frame r and have the result in a new column如何对数据框 r 中的几列执行 sapply 并将结果放在新列中
【发布时间】:2015-12-02 01:46:49
【问题描述】:

我有一个数据框:

val1 val2 val3 val4 val5
5 2 6 7 2
9 1 5 7 6
2 3 5 7 1

还有一个函数需要使用每一行的 val2, val3, val4 值

aFunction <- function(v2,v3,v4) {
    result = v2*2/v3 + max(max(v2,v3),v4)
    return(result)
}

我需要将此函数的结果存储在数据框中的新列中:

val1 val2 val3 val4 val5 result
5 2 4 7 2 8
9 3 2 7 6 10
2 10 5 7 1 14

但我不知道该怎么做,

我想过做

result = apply(df,function(x) {aFunction(x$val2,x$val3,x$val4)})

但它似乎不起作用

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    你应该构建一个通用函数。

    newFunction &lt;- function(a, b,c) { result= a*2/b +c; return(result)}

    获取三列的最大值。

    newConstant &lt;- max(max(df$val2, df$val3),df$val4)

    使用 sapply 应用于列并分配给新列。

    df$val5 &lt;- sapply(df, newFunction, df$val2, df$val3, newConstant)

    我现在无法运行此解决方案,但理论上该设置应该可以运行。

    【讨论】:

      【解决方案2】:

      您可以使用dplyr 包,它使用自然动词来完成该过程。在您的示例中使用第二组数字,您可以执行以下操作:

      zz <- "val1 val2 val3 val4 val5
      1 5 2 4 7 2
      2 9 3 2 7 6
      3 2 10 5 7 1"
      Data <- read.table(text=zz, header = TRUE) # Creates the dataframe
      
      library(dplyr)
      Data %>%
        rowwise() %>%
        mutate(result = (val2 * 2 / val3) + max(val2, val3, val4))
      

      该命令获取您的数据并指示它将评估所有rowwise(),这很重要,因此您不会获得数据框中每一行的最大值。最后,mutate() 根据您提供的函数创建一个新变量。

      要将数据保存到新元素,请在开头使用newdata &lt;-

      【讨论】:

        【解决方案3】:

        调用函数时,您需要以不同的方式访问列。此解决方案适用于您的示例:

        df<-read.table(text="val1 val2 val3 val4 val5
                   5 2 6 7 2
                   9 3 2 7 6
                   2 10 5 7 1",header=T)
        
        aFunction <- function(v2,v3,v4) {
         v2*2/v3 + max(max(v2,v3),v4)
        }
        
        df$results<-apply(df,1,function(x) {aFunction(x[2],x[3],x[4])})
        

        请注意,即使此答案专门解决了您的问题,其他答案也提供了更优雅的解决方案。

        【讨论】:

          猜你喜欢
          • 2021-08-02
          • 1970-01-01
          • 2012-09-07
          • 2023-01-12
          • 1970-01-01
          • 1970-01-01
          • 2020-11-03
          • 1970-01-01
          • 2019-04-16
          相关资源
          最近更新 更多