Nano Hash - криптовалюты, майнинг, программирование

Суммируйте пары столбцов по группам

Я хочу суммировать пары столбцов по группам. В приведенном ниже примере я хочу суммировать пары (v1 и v2), (v3 и v4) и (v5 и v6), каждую по r1, r2 и r3.

Я могу сделать это, используя оператор sapply ниже, и я получу правильный ответ. Однако требуемый код является сложным. Может ли кто-нибудь показать мне, как выполнить ту же операцию, возможно, в пакете data.table или с rollapply и/или другими параметрами? Я еще не изучал эти варианты.

Извините, если это дубликат.

my.data <- read.table(text= "
   r1  r2  r3    t1    t2    t3    v1   v2   v3   v4   v5   v6
    1   0   0    10    20    30     1    0    0    0    0    0
    1   0   0    10    20    30     1    1    0    0    0    0
    1   0   0    10    20    30     1    0    1    0    0    0
    1   0   0    10    20    30     1    0    1    1    0    0
    1   0   0    10    20    30     0    0    0    0    0    0

    0   1   0    10    20    30     0    1    1    1    1    1
    0   1   0    10    20    30     0    0    1    1    1    1
    0   1   0    10    20    30     0    0    0    1    1    1
    0   1   0    10    20    30     0    0    0    0    1    1
    0   1   0    10    20    30     0    0    0    0    0    1

    0   0   1    10    20    30     1    1    1    1    1    1
    0   0   1    10    20    30     1    0    1    1    1    1
    0   0   1    10    20    30     1    0    0    1    1    1
    0   0   1    10    20    30     1    0    0    0    1    1
    0   0   1    10    20    30     1    0    0    0    0    1
", header=TRUE, na.strings=NA)

my.data$my.group <- which(my.data[,1:3]==1, arr.ind=TRUE)[,2]
my.data

my.sums <- t(sapply(split(my.data[,7:(ncol(my.data)-1)], my.data$my.group), function(i) sapply(seq(2, ncol(i), 2), function(j) sum(i[,c((j-1),j)], na.rm=TRUE))))
my.sums

#   [,1] [,2] [,3]
# 1    5    3    0
# 2    1    5    9
# 3    6    5    9

  • Спасибо. Я починил это. Я удалил один столбец непосредственно перед публикацией и забыл изменить код группировки. 29.10.2013
  • когда вы говорите r1, r2` и т. д., это соответственно (относительно пар столбцов?) Кроме того, есть ли больше столбцов, чем в этом примере, или только те, которые показаны здесь? 29.10.2013
  • Реальный набор данных состоит из 110 столбцов или 55 пар для суммирования, а группирующие переменные r в этом примере изменяются от 1 до 5 вместо 1 до 3. Я не уверен, что вы имеете в виду под своим первым вопросом. 29.10.2013

Ответы:


1

Вот довольно общее выражение, которое вы, вероятно, можете упростить, если хотите, чтобы оно соответствовало вашим конкретным измерениям данных/именам столбцов/и т. д.:

library(data.table)
dt = data.table(my.data)

dt[, lapply(1:(ncol(.SD)/2), function(x) sum(.SD[[2*x-1]], .SD[[2*x]])),
     by = eval(grep('^r', names(dt), value = TRUE)),
     .SDcols = grep('^v', names(dt), value = TRUE)]
#   r1 r2 r3 V1 V2 V3
#1:  1  0  0  5  3  0
#2:  0  1  0  1  5  9
#3:  0  0  1  6  5  9
28.10.2013
  • Хороший! Я ожидал увидеть чудовищный 20-строчный ответ. 29.10.2013

  • 2

    Кроме того, используя aggregate и mapply:

    DF <- my.data
    
    #function to sum 2 columns
    fun <- function(col1, col2) 
    {
     rowSums(aggregate(DF[c(col1, col2)], by = list(DF$r1, DF$r2, DF$r3), sum)[c(4, 5)])
    }
    
    #all pairs of columns, to be summed, in a matrix
    #(7 is the column of v1)
    args_mat <- matrix(7:ncol(DF), ncol = 2, byrow = T)
    
    #apply `fun` to all pairs
    mapply(fun, args_mat[,1], args_mat[,2])
    #     [,1] [,2] [,3]
    #[1,]    5    3    0
    #[2,]    1    5    9
    #[3,]    6    5    9
    
    28.10.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..