【问题标题】:Rowwise summation for Tibble datatypeTibble 数据类型的逐行求和
【发布时间】:2017-01-07 05:55:56
【问题描述】:

我有一个 Tibble,我注意到 dplyr::rowwise()sum() 的组合不起作用。我知道这个主题有很多线程,我有 2 到 3 个解决方案,但我不太明白为什么 rowwise()sum() 的组合不起作用。

所以,我的问题是:为什么rowwise()sum() 的组合不起作用?我们可以做些什么来使它起作用?我是初学者,所以我相信我在下面的代码中做错了。

数据:

dput(data)
structure(list(Fiscal.Year = c(2016L, 2016L, 2016L, 2016L, 2016L, 
2016L, 2016L, 2016L, 2016L, 2016L), col1 = c(0, 26613797.764311, 
0, 12717073.587292, 0, 0, 0, 0, 0, 0), col2 = c(0, 0, 0, 0, 8969417.89721166, 
0, 11483606.8417117, 0, 0, 0), col3 = c(0, 0, 33251606.347943, 
0, 25082683.4492186, 0, 17337191.3014127, 0, 0, 0), col4 = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), col5 = c(0, 0, 0, 0, 0, 0, 0, 0, 
0, 9796823.229998), col6 = c(35822181.695755, 17475066.870565, 
0, 0, 0, 0, 4040695.327278, 0, 13117249.623068, 0), col7 = c(0, 
0, 0, 0, 0, 18347258.910001, 0, 0, 7002205.087399, 0), No.Trans = c(2987L, 
1292L, 1002L, 796L, 691L, 677L, 400L, 388L, 381L, 366L)), .Names = c("Fiscal.Year", 
"col1", "col2", "col3", "col4", "col5", "col6", "col7", "No.Trans"
), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))

此代码不起作用:

data %>%  #No
        dplyr::rowwise() %>%
        dplyr::mutate(sum = sum(.[2:8]))

仅供参考,我尝试了以下一组代码,它们可以工作。我正在专门寻找使用rowwise()sum() 的解决方案。

选项 1: 讨论于:Summarise over all columns

  data %>%
    dplyr::rowwise() %>%
    do(data.frame(., res = sum(unlist(.)[2:8])))

选项 2:

  rowSums(data[,2:8])

选项 3: 讨论于:How to do rowwise summation over selected columns using column index with dplyr?

  data %>% mutate(sum=Reduce("+",.[2:8]))

选项 4:

data %>%
        select(2:8)%>%
        dplyr::mutate(sum=rowSums(.))

【问题讨论】:

  • 为什么要走这条路线,与你在帖子中提到的一些方法相比效率不高
  • @akrun - 感谢您的提问。 “通过有效”,您指的是来自基础 R 的那个吗?作为初学者,我相信我对dplyr 缺乏了解。因此,我想学习如何修复错误。这只会帮助我。
  • rowSumsReduce这两种方法效率很高
  • 关于为什么它不起作用,我不确定。您获得的值与data[-1] %>% rowwise() %>% sum 相同,即。整个值的总和,它可能是一个错误或设计特性

标签: r dplyr


【解决方案1】:

那些列看起来很像观察结果......
如果是这样,整理该数据框将使数据争吵变得更加容易。

这是否为您提供了您正在寻找的答案?

data %>%
    gather(key = col, val = revenue, `col1`:`col7`) %>%
    group_by(Fiscal.Year, No.Trans) %>%
    summarise(res = sum(revenue))

Source: local data frame [10 x 3]
Groups: Fiscal.Year [?]

   Fiscal.Year No.Trans      res
         <int>    <int>    <dbl>
1         2016      366  9796823
2         2016      381 20119455
3         2016      388        0
4         2016      400 32861493
5         2016      677 18347259
6         2016      691 34052101
7         2016      796 12717074
8         2016     1002 33251606
9         2016     1292 44088865
10        2016     2987 35822182

要真正流畅地介绍整洁的思考,请尝试here。他在演示文稿中讨论的功能已经更新,但哈德利在教授该主题方面做得很好:通过教学链,就像它一样。

更新的函数可以在他的ggplot2here中找到。

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多