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

У меня есть дф:

Q1_3  Q2_3  Q3_3  Q4_3  Q5_3 ...  
16.01  8.23 18.13 11.14 18.03 ...  
17.25  7.50 11.72 10.84  7.24 ...  
3.08  2.12  4.39  3.16  2.44 ...    
4.94  3.95  6.87  3.75  4.10 ...  
3.89  8.35  7.80  2.90  2.55 ...  

Я хотел бы создать функцию, которая последовательно добавляет df[1:5], [6:10] и т. Д. И применяет это ко всему фрейму данных.

fun1<- function(x) c(x[1] + x[2], x[3] + x[4], x[5] + x[6], x[7] + x[8], x[9] + x[10], x[11] + x[12], x[13] + x[14]) 

Я использовал этот, чтобы сделать другой, который мне нужен, однако я думаю, что должен быть способ использовать seq() или rep() и применить его ко всему df.

testfun<- function(x) c(rowSums(x[1:5])) 

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

Спасибо

2 ответа

Решение

Мы можем зациклить последовательность (seq(1, ncol(df1), by =5)), создайте индекс (i:(i+4)), подмножество набора данных, сделать rowSums а потом cbind с оригинальным набором данных.

cbind(df1, sapply(seq(1, ncol(df1), by=5), function(i)
                rowSums(df1[i:pmin((i+4), ncol(df1))], na.rm=TRUE)))

Если нам нужна функция

f1 <- function(dat, n=5){
       cbind(dat, sapply(seq(1, ncol(dat), by = n), function(i)
             rowSums(dat[i:pmin((i+(n-1)), ncol(dat))], 
               na.rm=TRUE)))
       }
f1(df1) 
 n <- 5
 g <- as.numeric(gl(ncol(df1), n, ncol(df1)))
 e2 <- t(aggregate(t(as.matrix(df1))~ g, FUN=sum)[,-1])
 cbind(df1, e2)

1. построить фактор для группировки столбцов.
2. агрегировать транспонированный фрейм данных
3. cbind()

и немного короче:

n <- 5
g <- as.numeric(gl(ncol(df1), n, ncol(df1)))
e2 <- aggregate(t(df1)~ g, FUN=sum)
cbind(df1, t(e2[-1]))

как функция:

f <- function(df, n=5) {
    g <- as.numeric(gl(ncol(df), n, ncol(df)))
    aggregate(t(df)~ g, FUN=sum)
}
cbind(df1, t(f(df1)[-1]))
Другие вопросы по тегам