【问题标题】:Trouble applying function to data frame无法将功能应用于数据框
【发布时间】:2018-06-13 15:57:14
【问题描述】:

玩具示例:

> myfn = function(a,x){sum(a*x)}
> myfn(a=2, x=c(1,2,3))
[1] 12

到目前为止还不错。现在:

> df = data.frame(a=c(4,5))
> df$ans = myfn(a=df$a, x=c(1,2,3))
Warning message:
In a * x : longer object length is not a multiple of shorter object length

> df
  a ans
1 4  26
2 5  26

我想要发生的是,对于第一行,就好像我打电话给myfn(a=4, x=c(1,2,3),给出了24 的答案,而对于第二行,就好像我打电话给myfn(a=5, x=c(1,2,3) 给出了一个答案30 的答案。我该怎么做?谢谢你。

编辑:稍微复杂一点的版本。现在假设函数是

myfn = function(a,b, x){sum((a+b)*x)}

我有数据框

df = data.frame(a=c(4,5), b=c(6,7), c=c(9,9))

我想创建df$ans,这样第一行就好像我调用了myfn(a=4, b=6, x=c(1,2,3),第二行就好像我调用了myfn(a=5, b=7, x=c(1,2,3),也就是说,使用df$x 表示@ 987654332@,df$yb,忽略df$z

【问题讨论】:

    标签: r


    【解决方案1】:

    这样的事情会起作用:

    myfn = function(a,x){
      return(sum(a*x))
      }
    
    df <- data.frame(a=c(4,5))
    df$ans <- apply(df, 1, myfn, x = c(1,2,3))
    df$ans
    
      a ans
    1 4  24
    2 5  30
    

    ** 根据用户编辑编辑**

    df = data.frame(a=c(4,5), b=c(6,7), c=c(9,9))
    df$ans <- apply(df[, c("a", "b")], 1, function(y) sum((y['a']+y['b'])*c(1,2,3)))
      a b c ans
    1 4 6 9  60
    2 5 7 9  72
    

    【讨论】:

    • 谢谢。如果myfn 接受两个常量作为参数,除了向量,它们被存储为数据框中的列......那么调用会是apply(df, 1, 2, myfn, x = c(1,2,3))吗?
    • 不完全确定您的意思。您能否更新您的帖子以反映您想要的内容?
    • 感谢您...可以在不输入apply 中的整个函数的情况下完成此操作吗?我要使用的实际功能很长......
    • 不确定,我只是输入它并使用一些换行符。如果这是你想要的,可能会使用 mapply 方法
    • 是的,我最终还是选择了mapply。感谢您的帮助!
    【解决方案2】:

    有几种方法可以做到这一点,每种方法都有自己的魅力。如果你不想修改我会做的功能

    mapply(myfn, df$x, df$y, MoreArgs = list(x = 1:3))
    

    或者,您可以将迭代直接烘焙到函数中,例如,

    myfn = function(a,b, x){
        sapply(a+b, function(ab) {
            sum(ab*x)
        })
    }
    myfn(df$x, df$y, 1:3)
    

    这可能是我会做的方式。

    【讨论】:

    • 谢谢。假设x是某个任意向量,可能是经验数据,而不是1:3,有没有办法使用mapply的方法?
    • 当然,您可以为x 指定您喜欢的任何值。如果xab 一起变化,只需将值放入列表(其中length(a) == length(b) == length(x))并将其与ab 一起传递到... 列表中,而不是将其放入MoreArgs.
    • 好的。知道了。基本上我只需要在传递现有值之前调用list()。谢谢!
    • 其实...如果我需要传入两个向量怎么办? (在非玩具情况下)。有没有办法将MoreArgsxy 一起使用?
    • 正如复数 MoreArgs 所暗示的,您可以传递多个参数。详情请见?mapply
    猜你喜欢
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多