首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用“`rowSums`”的“`dplyr`”中的变异列

使用“`rowSums`”的“`dplyr`”中的变异列
EN

Stack Overflow用户
提问于 2017-01-27 13:46:29
回答 5查看 16.8K关注 0票数 12

最近,我无意中发现了dplyr的奇怪行为,如果有人能提供一些见解,我会很高兴的。

假设我有一个com列包含一些数值的数据。在一个简单的场景中,我想计算rowSums。尽管有很多方法可以做到这一点,但这里有两个例子:

代码语言:javascript
运行
复制
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进行计算。在这里,我渴望理解为什么上面的例子不起作用。问题不在于如何解决(参见解决办法),而在于理解应用天真方法时会发生什么。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-01-27 15:42:03

这些示例不起作用,因为您要在select中嵌套mutate并使用裸变量名。在这种情况下,select试图做类似的事情

代码语言:javascript
运行
复制
> -df$ids
Error in -df$ids : invalid argument to unary operator

这会失败,因为您不能否定字符串(即-"i1"-"i2"没有任何意义)。以下任何一种提法都是有效的:

代码语言:javascript
运行
复制
df %>% mutate(blubb = rowSums(select_(., "X1", "X2")))
df %>% mutate(blubb = rowSums(select(., -3)))

代码语言:javascript
运行
复制
df %>% mutate(blubb = rowSums(select_(., "-ids")))

如@Haboryme所建议的。

票数 33
EN

Stack Overflow用户

发布于 2020-03-30 21:11:33

select_已弃用。您可以使用:

代码语言:javascript
运行
复制
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))))
票数 5
EN

Stack Overflow用户

发布于 2018-08-28 15:37:49

添加到这个旧的线程,因为我搜索这个问题,然后意识到我问错了问题。另外,我在这个问题和相关问题中发现了一些渴望,希望找到正确的管道步骤来实现这一点。

这里的答案有些不直观,因为他们试图使用dplyr白话与非“整洁”的数据。如果你想用dplyr的方式做这件事,首先使用gather(),然后使用summarise()来整理数据。

代码语言:javascript
运行
复制
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()排序时,首先将该列作为一个因素。

代码语言:javascript
运行
复制
  df %>% 
  mutate(ids=as_factor(ids)) %>% 
  gather(key=Xn,value="value",-ids) %>% 
  group_by(ids) %>% 
  summarise(rowsum=sum(value))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41895432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档