2013-08-26 2 views
1

У меня есть список из 23 элементов с 69 строками и 13 столбцами каждый. И мне нужно применить вычисление по нескольким столбцам для каждого элемента списка.применить вычисления по нескольким столбцам каждого элемента в списке

В качестве простого примера, мой список выглядит следующим образом:

>list 
>$`1` 
>  a  b  c 
>1 2.1 1.4 3.4 
>2 4.4 2.6 5.5 
>3 2.6 0.4 3.0 
... 

>$`2` 
>  a  b  c 
>70 5.1 4.9 5.1 
>71 4.4 7.6 8.5 
>72 2.8 3.5 6.8 
... 

, что я хочу сделать что-то вроде z = (a-b)/c для каждого элемента ($ 1, $ 2 ... $ 23)

Я попытался следующий код:

для (I в 1:23) {
г = (список [[я]] $ а - список [[я]] $ б)/список [[я]] $ с }

, который дал мне только 49 значений, а не 1566 значения ,

Кто-нибудь знает, что не так с моим кодом и уметь его исправить? Большое спасибо!

+0

Вы переписываете 'z' каждый раз. Попробуйте сделать 'z' список и запись' z [[i]] <- (samestuff) ' –

+0

@Carl Witthoft Я использовал код' z = vector ("list", 23) 'для создания списка. Спасибо за ваш совет. – cactussss

ответ

2

Вы можете сделать это с помощью функции lapply(). Вот пример, предполагающий, что во всех столбцах фрейма данных одинаковое имя.

ll<-list(data.frame(a=1:3,b=4:6,c=7:9), 
     data.frame(a=1:3,b=6:4,c=7:9), 
     data.frame(a=1:3,b=4:6,c=9:7)) 

lapply(ll, with, (a-b)/c) 
+0

Благодарим вас за ответ. Это может показаться глупым, но не могли бы вы прояснить, что такое «1: 3», «4: 6», «7: 9», чтобы я мог воспроизвести код, который вы предложили, с моим реальным набором данных? Кстати, исходные данные не являются кадром данных, а списком. Спасибо! – cactussss

+0

@cactussss Как вы не представили воспроизводимый пример ваших данных, которые я только что сделал, может принадлежать. ll - список, состоящий из трех элементов списка, каждый из которых является кадром данных. –

+0

Я вижу. Спасибо за ваш ответ. Он отлично работает! Как следующий вопрос: как я могу заменить бесконечные значения нулем в списке? Я попробовал 'list [is.infinite] == 0', который дал мне следующее сообщение об ошибке« Ошибка в списке [is.infinite]: недопустимый тип индекса «встроенный». Btw, мой список не состоит из данных, а списков. – cactussss

0

Работа на @DidzisElferts ответ, вы можете использовать этот

lapply(ll, within, z <- (a-b)/c) 

добавить z как новый столбец на каждом dataframe.

+0

Спасибо за ваш ответ Фердинанд. Но что, если элементы моего списка не являются фреймом данных (в моем списке есть 23 списка). Более конкретно, команда 'class (list [[1]]) дает мне результат' 'list" '. Есть ли у вас идеи, как эффективно их преобразовывать в DataFrame? Благодарю. – cactussss

+0

Что я хочу сделать, это просто изменить класс элементов списка, но сохранить весь набор данных как сгруппированный (скажем, из списка из 23 списков в список из 23 кадров данных) – cactussss

+0

Если ваши элементы списка являются списками themsevlves, векторы одинаковой длины, вы можете использовать 'lapply (ll, as.data.frame)' для преобразования их в dataframes. –

Смежные вопросы