【问题标题】:Why can't I apply a function to create a new column with mutate() using dplyr?为什么我不能应用一个函数来使用 dplyr 创建一个带有 mutate() 的新列?
【发布时间】:2015-05-07 21:45:14
【问题描述】:

我有一个data.frame,我们称之为“df”。

我正在尝试创建一个列,我们称之为“结果”,将其他四列相加。

使用 dplyr,我可以使用以下代码:

mutate(df, result=col1+col2+col3+col4)

但是,当我尝试以下操作时:

mutate(df, result=sum(col1, col2, col3, col4))

它不工作。为什么会发生?

【问题讨论】:

  • 按照设计,它们做了两件不同的事情。忘记 dplyr,定义一些向量并将col1 + col2sum(col1,col2) 进行比较。他们做不同的事情。
  • 试试sum(df$col1,df$col2),你会发现它是一个标量,而不是一个向量。
  • sum() 总是折叠为单个值,mutate() 通过一次将整个列传递给函数来运行。 + 运算符是矢量化的,在这种情况下是首选。
  • 你是对的。它们完全不同。
  • 如果您想对所有列求和,但又不想输入+,可以使用Reduce(`+`,list(col1,col2,col3,col4))。我敢打赌,dplyr 的缩写是 list...

标签: r dplyr


【解决方案1】:

正如指出的 +sum() 行为不同。考虑:

> sum(1:10,1:10)
[1] 110
> `+`(1:10,1:10)
[1]  2  4  6  8 10 12 14 16 18 20

如果你真的想sum() 你想要的每一行的变量rowwise()

library(dplyr)
df <- data_frame(w = letters[1:3], x=1:3, y = x^2, z = y - x)

#     Source: local data frame [3 x 4]
#     
#       w x y z
#     1 a 1 1 0
#     2 b 2 4 2
#     3 c 3 9 6


df %>% rowwise() %>% mutate(result = sum(x, y, z))

#   Source: local data frame [3 x 5]
#   Groups: <by row>
#     
#     w x y z result
#   1 a 1 1 0      2
#   2 b 2 4 2      8
#   3 c 3 9 6     18

比较一下:

df %>% mutate(result = x + y + z)
#   Source: local data frame [3 x 5]
#   
#     w x y z result
#   1 a 1 1 0      2
#   2 b 2 4 2      8
#   3 c 3 9 6     18
df %>% mutate(result = sum(x, y, z))  # sums over all of x, y and z and recycles the result!
#   Source: local data frame [3 x 5]
#   
#     w x y z result
#   1 a 1 1 0     28
#   2 b 2 4 2     28
#   3 c 3 9 6     28

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2022-11-29
    • 1970-01-01
    • 2018-12-02
    相关资源
    最近更新 更多