2016-09-09 2 views
-2

Я хочу суммировать несколько столбцов кадров данных в списке и показывать только сумму, не показывая столбцы ввода (вычисления). Вот пример:R: Как суммировать несколько столбцов фреймов данных в списке?

ls <- list(data.frame(a=1, b=5, c=3, d=2), data.frame(a=NA, b=2, c=7, d=9)) 

ls 
[[1]] 
    a b c d 
1 1 5 3 2 

[[2]] 
    a b c d 
1 NA 2 7 9 

мой ожидаемый результат:

ls2 
[[1]] 
    c new 
1 3 8 

[[2]] 
    c new 
1 7 11 

Любые идеи, как это сделать? До сих пор я пытался увеличить этот answer для списков без успеха и без опускания входных столбцов (a, b, d). Я пытался до сих пор lapply:

lapply(ls, function(x) x$e <- rowSums(x[,c("a", "b", "d")], na.rm=T)) 
and 
ls$e <- lapply(ls, function(x) rowSums(x[,c("a", "b", "d")], na.rm=T)) 

Спасибо заранее

Edit: Благодаря Aech и Абду за ваши ответы, которые работают хорошо с этим примером. Однако у меня есть> 200 столбцов, знаете ли вы способ, не записывая столбцы, которые останутся? Как удаление столбцов, которые я использую для вычисления, вместо того, чтобы называть все столбцы.

EDIT 2: Спасибо за ваш улучшенный код, он хорошо работает с данными примера. Однако, мои истинные данные установить не ... Я получаю следующее сообщение об ошибке:

Error in rowSums(x[, columns_to_sum], na.rm = T) : 
'x' must be an array of at least two dimensions" 

Мой список насчитывает около 96 матриц с 200 столбцов и одной строки. Но я не знаю, как подготовить воспроизводимый пример моей ошибки. Есть идеи?

+0

Ваш другой вопрос является точной контратип этого. Вы не можете публиковать повторяющиеся вопросы о SO. Если этот вопрос недостаточно хорош, вы должны его отредактировать, предоставить минимальный воспроизводимый пример и точно объяснить, что именно вы ищете. –

ответ

3

Вы не должны называть свой список ls, так как ls является функцией.

lapply(myList, function(x) data.frame(c=x$c, new = rowSums(x[,c("a", "b", "d")], na.rm=T))) 

Вот решение, в котором вы указываете сброшенные столбцы только (после редактирования):

dropped <- c("a", "b", "d") 
lapply(myList, function(x) { 
    x$new <- rowSums(x[,dropped], na.rm=T) 
    x[!names(x) %in% dropped] 
    }) 
+0

спасибо ..см. мое редактирование –

+0

Если мы педантичны, вы не должны называть свой вектор 'drop', потому что функция' drop' является функцией. Я согласен, что 'ls' является более распространенной функцией и, скорее всего, вызывает путаницу, но все равно ... – Gregor

+0

Я добавляю новое редактирование, так как у меня все еще есть проблемы .. спасибо –

2

Try:

lapply(ls, function(x) { 
    x$new <- rowSums(x[,c("a", "b", "d")], na.rm=T) 
    return(x[,c("c","new")]) 
}) 

Edit:

Вы можете поместить столбцы, которые вы хотите использовать rowSums на в переменную следующим образом:

lapply(ls, function(x) { 
    columns_to_sum <- c("a", "b", "d") 
    x$new <- rowSums(x[,columns_to_sum], na.rm=T) 
    return(x[,!colnames(x) %in% columns_to_sum]) 
}) 

Здесь columns_to_sum является переменной, которая сохраняет имена колонок, которые вы хотите применить rowSums.

Надеюсь, это поможет.

+0

спасибо .. см. Мое редактирование –

+0

Я добавляю новое редактирование, так как у меня все еще есть проблемы .. спасибо –

+0

@ N.Varela 'columns_to_sum' не может быть одним столбцом. Он должен содержать более одного столбца, иначе функция 'rowSums' не будет работать. – Abdou