R:列值与另一列的范围值之和
你好 我有一张两列的表格。在第一列(x)中,有一些值,我想根据指定的值范围(在我的示例中为-300)将其划分为类别。然后使用这些类别,我想对另一列(v)中的值求和。例如,使用我的测试数据:第一类是从65100到65400(65100) 结果是:有一个由两列组成的表格。第一列是x的类别;第二列是v的相应值之和 谢谢你R:列值与另一列的范围值之和,r,R,你好 我有一张两列的表格。在第一列(x)中,有一些值,我想根据指定的值范围(在我的示例中为-300)将其划分为类别。然后使用这些类别,我想对另一列(v)中的值求和。例如,使用我的测试数据:第一类是从65100到65400(65100) 结果是:有一个由两列组成的表格。第一列是x的类别;第二列是v的相应值之和 谢谢你 # data set.seed(1) x <- sample(seq(65100, 67900, by=5), 100, replace = TRUE) v <- sam
# 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)
#数据
种子(1)
我知道你想:
切向量x
使用预先计算的截止阈值
使用这些分组计算向量v上的和
这是一行代码,包含data.table
和链接。您的数据位于data.table
中,名为DT
DT[,CUT:=CUT(x,breaks)][,sum(v),by=CUT]
说明:
首先,将截止值分配给变量中断
如下
使用dplyr时会中断我习惯这样做。尽管我也喜欢cut解决方案
# 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))
#数据
种子(1)
x%
按(g)分组%>%总结(sumvalue=总和(值))
结果:
g sumvalue
<dbl> <int>
65400 28552
65700 49487
66000 45493
66300 77865
66600 43887
66900 21187
67200 65785
67500 66517
67800 61738
68100 1722
g值
65400 28552
65700 49487
66000 45493
66300 77865
66600 43887
66900 21187
67200 65785
67500 66517
67800 61738
68100 1722
试试这个(不需要软件包):
s您可以使用列上的cut
按类别进行分类。似乎许多问题已经解释了如何使用cut
然后总结或聚合
,如下所示:
g sumvalue
<dbl> <int>
65400 28552
65700 49487
66000 45493
66300 77865
66600 43887
66900 21187
67200 65785
67500 66517
67800 61738
68100 1722
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