【问题标题】:Sum up specific rows for each column总结每一列的特定行
【发布时间】:2018-12-17 14:16:27
【问题描述】:

我确信我的问题很容易解决,不幸的是我无法为自己想出一个简单的解决方案。我想为每一列总结数据集的某些行。

我的数据集如下所示:

    GIVN  MICP  GFIP
-2  0.01  0.02  0.01
-1  0.03 -0.01  0.01
0  -0.02 -0.03  0.01
1  -0.04  0.05 -0.02
2   0.01  0.02  0.03

现在我希望它从第 -1 行到第 1 行和从第 -2 行到第 1 行的每一列求和一次。

-1 到 1 应该是这样的:

    GIVN  MICP  GFIP
   -0.03  0.01  0.00

使用 colSums 函数,我只添加每列中的所有行,这不是我想要做的。

【问题讨论】:

  • 您可能需要考虑将colSums 与您的数据子集一起使用(例如,data[2:4,] 用于数据的第二行、第三行和第四行)
  • colSums(df[which(rownames(df) == -1):which(rownames(df) == 1),])
  • @p0bs 谢谢你,正是我需要的
  • @M.Berns 很高兴听到这个消息!
  • @Sotos 非常感谢

标签: r sum rowsum


【解决方案1】:

这是dplyr 的一个选项,但有点笨拙。棘手之处在于您没有将 ID 完全切割成互斥的组,因此您需要使用本质上独立的数据帧进行操作,然后将它们重新绑定在一起。

首先,您需要将行名设为数字,以便比较数字范围。

您将为 ID 组过滤数据; dplyr::between 是一个实用函数,用于查找数字是否在一个范围内,包括范围的端点。我正在添加一个带有mutate 的变量来指定哪个组数据来自;如果您不需要详细说明,可以删除 mutates 并在 bind_rows 中添加一个 .id 参数。总结时,您只需要某种方式来区分各个组。

这进入了bind_rows 调用,类似于rbind,但一次可以获取超过2 个数据帧。然后group_by 进行总结。如果您有太多列并且在 summarise_at 中命名它们变得很麻烦,您可以删除 ID 并使用 summarise_allsummarise_if

library(dplyr)
df$id <- as.numeric(row.names(df))

bind_rows(
  df %>% filter(between(id, -1, 1)) %>% mutate(group = "-1 to 1"),
  df %>% filter(between(id, -2, 1)) %>% mutate(group = "-2 to 1")
) %>%
  group_by(group) %>%
  summarise_at(vars(GIVN:GFIP), sum)
#> # A tibble: 2 x 4
#>   group    GIVN  MICP  GFIP
#>   <chr>   <dbl> <dbl> <dbl>
#> 1 -1 to 1 -0.03  0.01  0   
#> 2 -2 to 1 -0.02  0.03  0.01

reprex package (v0.2.1) 于 2018 年 12 月 17 日创建

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多