R: добавление строк в кадр данных в зависимости от другой переменной

Я пытаюсь сделать что-то условное rowSums .

У меня есть фрейм данных с четырьмя столбцами, содержащими 1 и 0, и другие переменные, которые указывают, какие столбцы должны быть добавлены, чтобы составить итоговые значения строк.

Например:

df <- matrix(rbinom(40, 1, 0.5), ncol = 4)
df <- as.data.frame.matrix(df)
df$group <- sample(c(཈', 飓', 񟡂'), 10, replace = T)

Если группе 12 , то следует добавить столбцы V1: V2, если 123 тогда V1: V3, а если 1234 то столбцы V1: V4.

Я пробовал трудоемкий подход:

df$total12 <- rowSums(df[,c('V1', 'V2')])
df$total123 <- rowSums(df[,c('V1', 'V2', 'V3')])
df$total1234 <- rowSums(df[,c('V1', 'V2', 'V3', 'V4')])
df$total <- ifelse(df$group == ཈', df$total12,
                   ifelse(df$group == 飓', df$total123, df$total1234))

Есть ли более простой способ сделать это?

Всего 2 ответа


Вот вариант. Мы создаем индекс строки / столбца, разбивая «группу», извлекаем значения «df» на основе индекса и получаем sum сгруппированную индексом row

lst <- strsplit(df$group, "")
i1 <- cbind(rep(seq_len(nrow(df)), lengths(lst)), as.integer(unlist(lst)))
df$total <- ave(df[-5][i1], i1[,1], FUN = sum)

Вот еще один вариант использования функции switch . Это более читаемо и проще расширять серию вложенных операторов ifelse .

df$total<-sapply(1:length(df$group), function(i){switch(df$group[i], 
            "12"=rowSums(df[i, c('V1', 'V2')]),
            "123"=rowSums(df[i, c('V1', 'V2', 'V3')]),
            "1234"=rowSums(df[i, c('V1', 'V2', 'V3', 'V4')]))})

В принципе, циклы через элементы df $ group и выбирают правильную формулу для использования. Если ваш набор данных не слишком длинный, производительность должна быть приемлемой.


Есть идеи?

10000