Добавление строк и применение их к фрейму данных в 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. Я был бы признателен за вашу помощь.

Спасибо


person Csaba Szabo    schedule 20.11.2015    source источник


Ответы (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) 
person akrun    schedule 20.11.2015
comment
Я думаю, что этот работает хорошо! Мне просто нужно поместить его в функцию, чтобы я мог применить его и к другим фреймам данных! Большое спасибо - person Csaba Szabo; 20.11.2015
comment
@CsabaSzabo На основе этого легко создать функцию. я обновлю - person akrun; 20.11.2015
comment
Большое спасибо @akrun, это спасло мне жизнь! Что мне нужно добавить в функцию, чтобы подмножить только результат на выходе без репликации предыдущих переменных? - person Csaba Szabo; 20.11.2015
comment
@CsabaSzabo Если вам не нужен исходный набор данных, просто удалите cbind(dat, в функции. - person akrun; 20.11.2015
comment
Просто еще раз выражаю свою благодарность: эта функция решает мою первую команду так же, как если бы мы изменили n=5 на n=2, она добавила бы x[1:2], x[3:4] и так далее! Я просто подумал, что добавлю его, чтобы поблагодарить вас, и я уверен, что это поможет и другим читателям! :) @akrun - person Csaba Szabo; 20.11.2015

 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]))
person jogo    schedule 20.11.2015
comment
Я не уверен, что этот возвращает tbh, поскольку у меня тот же ncol, что и исходный df, однако я не уверен, какие переменные в них... У меня должно быть ncol/5 на выходе, так как каждый 5-й столбец суммируется... - person Csaba Szabo; 20.11.2015
comment
Я построил другое решение, которое дает желаемый результат. - person jogo; 20.11.2015
comment
e2 == f1(df) возвращает все верно! :)) большое спасибо @jogo, это тоже работает :) - person Csaba Szabo; 20.11.2015
comment
Я думаю, что только as.numeric(gl(ncol(df1), 5, ncol(df1))) должно работать. (не испытано) - person akrun; 20.11.2015
comment
который создает неиспользуемые уровни (но работает... и код короче). as.numeric() не нужен только для группировки. Я проверил свой код. - person jogo; 20.11.2015
comment
Я завернул as.numeric, чтобы избежать проблемы unused level - person akrun; 20.11.2015
comment
Я использовал вашу идею в новой версии, теперь с переменной n - person jogo; 20.11.2015