我想向基于行计算的数据框添加一个新列。假设我有一个这样的数据框:
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/