最近,我无意中发现了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)
首先,我不太明白是什么导致了错误,其次,我想知道如何以一种整洁的方式实现一些(可行的)列的整洁计算。
编辑
问题变体和rowSums排除列,虽然相关,但重点是使用rowSums
进行计算。在这里,我渴望理解为什么上面的例子不起作用。问题不在于如何解决(参见解决办法),而在于理解应用天真方法时会发生什么。
发布于 2017-01-27 15:42:03
这些示例不起作用,因为您要在select
中嵌套mutate
并使用裸变量名。在这种情况下,select
试图做类似的事情
> -df$ids
Error in -df$ids : invalid argument to unary operator
这会失败,因为您不能否定字符串(即-"i1"
或-"i2"
没有任何意义)。以下任何一种提法都是有效的:
df %>% mutate(blubb = rowSums(select_(., "X1", "X2")))
df %>% mutate(blubb = rowSums(select(., -3)))
或
df %>% mutate(blubb = rowSums(select_(., "-ids")))
如@Haboryme所建议的。
发布于 2020-03-30 21:11:33
select_
是已弃用。您可以使用:
library(dplyr)
df <- data.frame(matrix(rnorm(20), 10, 2),
ids = paste("i", 1:20, sep = ""),
stringsAsFactors = FALSE)
df %>%
mutate(blubb = rowSums(select(., .dots = c("X1", "X2"))))
# Or more generally:
desired_columns <- c("X1", "X2")
df %>%
mutate(blubb = rowSums(select(., .dots = all_of(desired_columns))))
发布于 2018-08-28 15:37:49
添加到这个旧的线程,因为我搜索这个问题,然后意识到我问错了问题。另外,我在这个问题和相关问题中发现了一些渴望,希望找到正确的管道步骤来实现这一点。
这里的答案有些不直观,因为他们试图使用dplyr白话与非“整洁”的数据。如果你想用dplyr的方式做这件事,首先使用gather()
,然后使用summarise()
来整理数据。
library(tidyverse)
df <- data.frame(matrix(rnorm(20), 10, 2),
ids = paste("i", 1:20, sep = ""),
stringsAsFactors = FALSE)
df %>% gather(key=Xn,value="value",-ids) %>%
group_by(ids) %>%
summarise(rowsum=sum(value))
#> # A tibble: 20 x 2
#> ids rowsum
#> <chr> <dbl>
#> 1 i1 0.942
#> 2 i10 -0.330
#> 3 i11 0.942
#> 4 i12 -0.721
#> 5 i13 2.50
#> 6 i14 -0.611
#> 7 i15 -0.799
#> 8 i16 1.84
#> 9 i17 -0.629
#> 10 i18 -1.39
#> 11 i19 1.44
#> 12 i2 -0.721
#> 13 i20 -0.330
#> 14 i3 2.50
#> 15 i4 -0.611
#> 16 i5 -0.799
#> 17 i6 1.84
#> 18 i7 -0.629
#> 19 i8 -1.39
#> 20 i9 1.44
如果您关心ids的顺序,当它们不能使用arrange()
排序时,首先将该列作为一个因素。
df %>%
mutate(ids=as_factor(ids)) %>%
gather(key=Xn,value="value",-ids) %>%
group_by(ids) %>%
summarise(rowsum=sum(value))
https://stackoverflow.com/questions/41895432
复制相似问题