美好的一天!
我有一张两列的表格。在第一列(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)
答案 0 :(得分:1)
我明白你想:
这是一行代码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