Вычисление диапазона значений столбцов для каждого объекта в кадре данных в R - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть фрейм данных, и я хочу найти значения для каждого предмета (имен), которые будут суммой диапазона столбцов (index1: index2)

names = c('a', 'b', 'c')
index1 = c(5, 6, 4)
index2 = c(7,8,7)
time1 = c(1,1,1)
time2 = c(2,2,2)
time3 = c(3,3,3)
time4 = c(4,4,4)
time5 = c(5,5,5)
df = data.frame(names, index1, index2, time1, time2, time3, time4, time5)

    names index1 index2 time1 time2 time3 time4 time5
1     a      5      7     1     2     3     4     5
2     b      6      8     1     2     3     4     5
3     c      4      7     1     2     3     4     5

Вывод будет:

ans = 9 12 10

[5: 7] для a будет 2,3,4 = 9

[6: 8] для b будет 3,4,5 = 12

[4: 7] для c будет 1,2,3,4 = 10

У меня огромный набор данных.Это всего лишь пример.Пожалуйста, помогите!

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Используя mapply, мы можем сделать

mapply(function(x, y, z) sum(df[x, y:z]), seq_len(nrow(df)), df$index1, df$index2)
#[1]  9 12 10

Однако вместо подстановки фрейма данных в mapply я считаю, что разбиение каждой строки будет более эффективным для больших наборов данных.

mapply(function(x, y, z) sum(x[y:z]), 
        split(df, seq_len(nrow(df))), df$index1, df$index2)

Подход tidyverse может заключаться в определении n сначала (число столбцов, отличных от time), gather в длинном формате, group_by каждый namesи рассчитать sum

library(dplyr)
library(tidyr)

n <- 3

df %>%
  gather(key, value, -(1:n)) %>%
  group_by(names) %>%
  summarise(sum = sum(value[(index1[1] - n):(index2[1] - n)])) %>%
  pull(sum)

#[1]  9 12 10
0 голосов
/ 24 апреля 2019

Альтернатива:

apply(df, 1, function(x) sum(as.integer(x[x[["index1"]]:x[["index2"]]])))

Еще один:

apply(df[-1], 1, function(x) sum((x[(x[["index1"]]:x[["index2"]]) - 1L])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...