我想向基于行计算的数据框添加一个新列。假设我有一个这样的数据框:

x <-as.data.frame(matrix(1:10, 5, 2))

  V1 V2
1  1  6
2  2  7
3  3  8
4  4  9
5  5 10

如果我想做一些 rowwise 操作来生成一个新列,我可以使用 rowwise() 和 do() 来完成。例如:
y <- rowwise(x) %>% do (foo = .$V1 * .$V2)

我什至可以将其附加到现有的数据框中:
y <- rowwise(x) %>% bind_cols(do (., foo = .$V1 * .$V2))

这一切都有效,但结果并不完全是我想要的。 y$foo 中的值是列表,而不是数字。
  V1 V2 foo
1  1  6   6
2  2  7  14
3  3  8  24
4  4  9  36
5  5 10  50

看起来正确,但事实并非如此。
class(y$foo)
[1] "list"

所以,两个问题:
  • 有没有办法让结果变成数字而不是列表?
  • 有没有更好的方法来解决这个问题?

  • 更新:
    这更接近我想要做的事情。鉴于此功能:
    pts <- 11:20
    z <- function(x1, x2) {
      min(x1*x2*pts)
    }
    

    这不会产生我所期望的:
    y <- x %>% mutate(foo = z(V1, V2))
      V1 V2 foo
    1  1  6  66
    2  2  7  66
    3  3  8  66
    4  4  9  66
    5  5 10  66
    

    虽然这样做:
    y <-rowwise(x) %>% bind_cols( do (., data.frame(foo = z(.$V1, .$V2))))
      V1 V2 foo
    1  1  6  66
    2  2  7 154
    3  3  8 264
    4  4  9 396
    5  5 10 550
    

    为什么?有没有更好的办法?

    最佳答案

    你应该只在你的 data.frame 语句中返回一个 do :

    y <- rowwise(x) %>% bind_cols(do(., data.frame(foo = .$V1 * .$V2)))
    y
    ##   V1 V2 foo
    ## 1  1  6   6
    ## 2  2  7  14
    ## 3  3  8  24
    ## 4  4  9  36
    ## 5  5 10  50
    y$foo
    ## [1]  6 14 24 36 50
    

    在您更新的问题中,您在带有 rowwise 语句的链中缺少 mutate,但是在带有 rowwise 语句的链中包含 do。只需添加 rowwise,您将获得相同的结果。
    x %>% rowwise %>% mutate(foo = z(V1, V2))
    ## Source: local data frame [5 x 3]
    ## Groups: <by row>
    ##
    ##   V1 V2 foo
    ## 1  1  6  66
    ## 2  2  7 154
    ## 3  3  8 264
    ## 4  4  9 396
    ## 5  5 10 550
    

    关于r - 如何使用 dplyr 基于行数据生成新列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30341483/

    10-12 17:35