最近,我偶然发现了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
进行计算。在这里,我急切地想了解为什么上面的例子不起作用。它不是关于如何求解(见变通方法),而是了解当应用天真的方法时会发生什么。
6条答案
按热度按时间2fjabf4q1#
这些示例不起作用,因为您在
mutate
中嵌套了select
,并且使用了空变量名。它会失败,因为您无法对字符串求反(即
-"i1"
或-"i2"
没有意义)。下面的公式都可以使用:或
如@Haboryme所建议的。
plupiseo2#
select_
是deprecated。您可以用途:drkbr07n3#
添加到这个旧线程,因为我搜索了这个问题,然后意识到我问错了问题。此外,我检测到一些渴望在这个和相关的问题,为适当的管道步骤的方式来做到这一点。
这里的答案有些不直观,因为他们试图对非“整洁”数据使用dplyr语言。
如果你关心id的顺序,当它们不能使用
arrange()
排序时,首先把该列作为一个因子。bis0qfac4#
为什么要使用管道符?只需编写如下表达式:
即计算所有数值列的行和,其优点是不需要指定
ids
。bttbmeg05#
如果要将结果保存为数据中的列,可以使用data.table语法,如下所示:
zc0qhyus6#
select
现在可以接受空列名,因此无需使用已弃用的.dots
或select_
。以下是几种目前可行的方法。