【发布时间】:2017-01-27 13:46:29
【问题描述】:
最近我偶然发现dplyr 的一个奇怪行为,如果有人能提供一些见解,我会很高兴。
假设我有一个数据,其中 com 列包含一些数值。在一个简单的场景中,我想计算rowSums。虽然有很多方法可以做到,但这里有两个例子:
df <- data.frame(matrix(rnorm(20), 10, 2),
ids = paste("i", 1:20, sep = ""),
stringsAsFactors = FALSE)
# works
dplyr::select(df, - ids) %>% {rowSums(.)}
# does not work
# Error: invalid argument to unary operator
df %>%
dplyr::mutate(blubb = dplyr::select(df, - ids) %>% {rowSums(.)})
# does not work
# Error: invalid argument to unary operator
df %>%
dplyr::mutate(blubb = dplyr::select(., - ids) %>% {rowSums(.)})
# workaround:
tmp <- dplyr::select(df, - ids) %>% {rowSums(.)}
df %>%
dplyr::mutate(blubb = tmp)
# works
rowSums(dplyr::select(df, - ids))
# does not work
# Error: invalid argument to unary operator
df %>%
dplyr::mutate(blubb = rowSums(dplyr::select(df, - ids)))
# workaround
tmp <- rowSums(dplyr::select(df, - ids))
df %>%
dplyr::mutate(blubb = tmp)
首先,我不太了解导致错误的原因,其次我想知道如何以一种整洁的方式实际实现一些(可行的)列的整洁计算。
编辑
mutate and rowSums exclude columns 问题虽然相关,但侧重于使用rowSums 进行计算。在这里,我很想了解为什么上面的示例不起作用。与其说是如何解决(参见解决方法),不如说是了解应用幼稚方法时会发生什么。
【问题讨论】:
-
为什么不
dplyr::select(df, - ids) %>% mutate(foo=rowSums(.)) -
试试
ids = paste("-i", 1:20, sep = "")我想我在某处读过这篇文章 -
@WeihuangWong 那里的问题虽然相关,但侧重于使用
rowSums进行计算。在这里,我很想了解为什么上面的示例不起作用。与其说是如何解决(见解决方法),不如说是了解应用朴素方法时会发生什么 -
@Haboryme 我想保留 ID 以供以后使用。因此,我想在
mutate函数中进行选择。