Суммируйте значения столбцов после каждых 10 строк в кадре данных R - PullRequest
0 голосов
/ 24 октября 2018

У меня есть кадр данных с 300000 строками в R следующим образом:

11 2990000 3000000 0.00000000
11 3000000 3010000 2.30247191
11 3010000 3020000 0.32213483
11 3020000 3030000 0.91696629
11 3030000 3040000 1.81595506
11 3040000 3050000 0.27269663
11 3050000 3060000 2.21988764
11 3060000 3070000 3.44640449
11 3070000 3080000 2.02134831
11 3080000 3090000 1.22123596 #10th row
11 3090000 3100000 3.47089888
11 3100000 3110000 3.08921348
11 3110000 3120000 3.11786517
11 3120000 3130000 1.44325843
11 3130000 3140000 0.00000000
11 3140000 3150000 0.00000000
11 3150000 3160000 2.55146067
11 3160000 3170000 0.63460674
11 3170000 3180000 1.08415730
11 3180000 3190000 2.73101124 #20th row

Я хочу создать новый кадр данных, который суммирует столбец 4 каждых 10 строк, ивыводит столбец 2 и столбец 3 первой и десятой рассматриваемых строк соответственно.Вывод этого должен быть:

11 2990000 3090000 14.5391
11 3090000 3190000 18.12247

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Вот решение с data.table:

library("data.table")
D <- fread(
"11 2990000 3000000 0.00000000
11 3000000 3010000 2.30247191
11 3010000 3020000 0.32213483
11 3020000 3030000 0.91696629
11 3030000 3040000 1.81595506
11 3040000 3050000 0.27269663
11 3050000 3060000 2.21988764
11 3060000 3070000 3.44640449
11 3070000 3080000 2.02134831
11 3080000 3090000 1.22123596
11 3090000 3100000 3.47089888
11 3100000 3110000 3.08921348
11 3110000 3120000 3.11786517
11 3120000 3130000 1.44325843
11 3130000 3140000 0.00000000
11 3140000 3150000 0.00000000
11 3150000 3160000 2.55146067
11 3160000 3170000 0.63460674
11 3170000 3180000 1.08415730
11 3180000 3190000 2.73101124")

D[, .(V2=V2[1], V3=V3[.N], V4=sum(V4)), by=gl(D[, .N]/10, 10)]
# > D[, .(V2=V2[1], V3=V3[.N], V4=sum(V4)), by=gl(D[, .N]/10, 10)]
#    gl      V2      V3       V4
# 1:  1 2990000 3090000 14.53910
# 2:  2 3090000 3190000 18.12247
0 голосов
/ 24 октября 2018

Объединение существующих ответов из:

Выбор каждой n-й строки в фрейме данных
Сумма по каждой n-й точке

v = D$V4
n = 10

#using @jogo's example data
cbind(
  D[ seq(1, nrow(D), n), 1:3 ],
  tapply(v, (seq_along(v)-1) %/% n, sum)
  )

#    V1      V2      V3       V2
# 1: 11 2990000 3000000 14.53910
# 2: 11 3090000 3100000 18.12247
0 голосов
/ 24 октября 2018

Вы можете попробовать tidyverse

library(tidyverse)
d %>% 
  group_by(gr=gl(n()/10,10)) %>% 
  summarise(Sum=sum(V4)) 
# A tibble: 2 x 2
  gr      Sum
  <fct> <dbl>
1 1      14.5
2 2      18.1

или попробовать mutate

d %>% 
  group_by(gr=gl(n()/10,10)) %>% 
  mutate(Sum=sum(V4)) %>%
  slice(10)
# A tibble: 2 x 6
# Groups:   gr [2]
     V1      V2      V3    V4 gr      Sum
  <int>   <int>   <int> <dbl> <fct> <dbl>
1    11 3080000 3090000  1.22 1      14.5
2    11 3180000 3190000  2.73 2      18.1

В базе R вы можете использовать ave

ave(d$V4, factor(rep(1:(nrow(d)/10), each=10)), FUN=sum)[seq(10, nrow(d), 10)] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...