gpt4 book ai didi

r - 如何使用 dplyr 基于行数据生成新列?

转载 作者:行者123 更新时间:2023-12-03 07:59:52 25 4
gpt4 key购买 nike

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

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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com