R:通过另一列的范围值对列值求和

时间:2016-10-14 10:00:17

标签: r

美好的一天!

我有一张两列的表格。在第一列(x)中,我想根据指定的值范围(在我的实例中为300)将值划分为多个类别。然后使用这些类别我想在另一列(v)中求和值。例如,使用我的测试数据:第一类是从65100到65400(65100

结果:有一个包含两列的表。第一个是x的类别;第二列是v。

的相应值的总和

谢谢!!!

# data
set.seed(1)
x <- sample(seq(65100, 67900, by=5), 100, replace = TRUE)
v <- sample(seq(1000, 8000), 100, replace = TRUE)
tabl <- data.frame(x=c(x), v=c(v))
attach(tabl)
#categories
seq(((min(x) - min(x)%%300) + 300), ((max(x) - max(x)%%300) + 300), by =300)

3 个答案:

答案 0 :(得分:1)

我明白你想:

  1. 剪切矢量x,
  2. 使用预先计算的截止阈值
  3. 使用这些分组计算向量v的总和
  4. 这是一行代码data.table和链接。您的数据位于名为data.table的{​​{1}}。

    DT

    解释

    首先,像这样为变量DT[, CUT := cut(x, breaks)][, sum(v), by=CUT]分配截止值。

    breaks

    第二次,计算新列breaks <- seq(((min(x) - min(x) %% 300) + 300), ((max(x) - max(x) %% 300) + 300), by =300),按CUT中的数据对行进行分组。

    breaks

    第三次,使用DT[, CUT := cut(x, breaks)]对小组中的v列求和。我用上一个链接了这个操作。

    by=

    将您的DT[, CUT := cut(x, breaks)][, sum(v), by=CUT]转换为data.frame,就像这样。

    data.table

    这是最终结果:

    library(data.table)
    DT <- as.data.table(tabl)

    你可以穿上它来改善美感。例如,您可以重置因子级别以便于阅读。

答案 1 :(得分:0)

当我使用dplyr时,我习惯这样做。虽然我也喜欢切割解决方案。

# data
set.seed(1)
x <- sample(seq(65100, 67900, by=5), 100, replace = TRUE)
v <- sample(seq(1000, 8000), 100, replace = TRUE)
tabl <- data.frame(group=c(x), value=c(v))
attach(tabl)
#categories
s <- seq(((min(x) - min(x)%%300) + 300), ((max(x) - max(x)%%300) + 300), by =300)

 tabl %>% rowwise() %>% mutate(g = s[min(which(group < s), na.rm=T)]) %>% ungroup() %>%
   group_by(g) %>% summarise(sumvalue = sum(value))

结果:

 g        sumvalue
 <dbl>    <int>
 65400    28552
 65700    49487
 66000    45493
 66300    77865
 66600    43887
 66900    21187
 67200    65785
 67500    66517
 67800    61738
 68100     1722     

答案 2 :(得分:0)

试试这个(不需要包装):

s <- seq(65100, max(tabl$x)+300, 300)
tabl$col = as.vector(cut(tabl$x, breaks = s, labels = 1:10))
df <- aggregate(v~col, tabl, sum)

   # col     v
# 1    1 33234
# 2    2 44805
# 3    3 45493
# 4    4 77865
# 5    5 43887
# 6    6 22893
# 7    7 64079
# 8    8 66517
# 9    9 61738
# 10  10  1722