Применить функцию к строкам внутри нескольких кадров data.frames

Не знаю, как это задать, но попробую:

У меня есть 20 data.frames (например, 2006_1, 2006_2, 2007_1, 2007_2, ...), которые я импортировал из MS Access.

Каждый data.frame имеет 10 столбцов и примерно 3 миллиона строк.

Первый столбец в каждом data.frame называется secuityName, который представляет собой список тикеров акций, за которыми следуют некоторые теги.

Я хотел бы поднять каждую строку в столбце SecurityName в каждом из 20 кадров data.frames.

Структура следующая:

2006_1

> **SecurityName**   **...**
> AAPL abcdef        **...**
> MSFT abcdef        **...**

2006_2

> **SecurityName**   **...**
> AAPL abcdef        **...**
> MSFT abcdef        **...**

Я бы хотел, чтобы каждый выглядел так:

2006_1

> **SecurityName**   **...**
> AAPL ABCDEF        **...**
> MSFT ABCDEF        **...**

У меня есть вектор с именем * Raw_data_vector *, который имеет все имена data.frame

Raw_data_vector

> 2006_1
> 2006_2
> 2007_1
> 2007_2
> ...

Я пытался использовать lapply, но не могу заставить его работать:

lapply(1:length(Raw_data_vector), function(x) toupper(get(x)[,1]),Raw_data_vector)

person Brad    schedule 19.06.2012    source источник
comment
Вы можете получить data.frame имена, используя аргумент шаблона для ls, однако переменные, названные с использованием чисел, часто вызывают больше головной боли, чем пользы. вы можете подумать об изменении их имен, прежде чем продолжить.   -  person Justin    schedule 19.06.2012
comment
@ user1399173 Учитывая тип и размер ваших данных, вы можете обнаружить, что пакет data.table является удобнее и быстрее. Лучше всего начать с отзывов пользователей, а затем с презентаций.   -  person Matt Dowle    schedule 21.06.2012


Ответы (1)


Это должно вас начать. Я использовал data.frames, у которых есть персонажи, начинающиеся со своих имен, поэтому я не заканчиваю какие-то забавные дела.

oh6_1 <- data.frame(SecurityName=letters[1:20], v=1:20)
oh6_2 <- oh6_1

out <- lapply(ls(pattern = 'oh[0-9]_*'), 
              function(x) {
                df <- get(x)
                df[, 1] <- toupper(df[, 1])  
                return(df)
              })

По комментариям:

В зависимости от имен ваших data.frames вам нужно будет изменить аргумент pattern на ls. Кроме того, R не меняет ничего на месте (по большей части), а создает новый.

Вы видите его как вывод на консоль, потому что он ни к чему не привязан! Вместо этого используйте что-нибудь вроде out <- llply(ls(...)...). Затем осмотрите out. Это будет список фреймов данных, которые вы предоставили с их дополнительным столбцом. Вы можете проверять R объектов с помощью ?str.

Наконец, представление о списке объектов является обычным результатом при работе со многими похожими (или идентичными) вещами. Отсюда легко продолжить выполнение любого процесса, который вы хотите, accept вместо вызова function(data.frame) в чем-то вроде цикла for, вы можете вызвать lapply(list of data frames, function)

... Ясно, как грязь, чтобы быть уверенным.

Если вы должны выполнить операцию в нижнем регистре с существующим data.frame, вы можете использовать всегда пугающую assign функцию:

myfun <- function(X) {
  df <- get(x)
  df[, 1] <- toupper(df[, 1])
  assign(x, df, .GlobalEnv)
  return(NULL)
}

lapply(ls(), myfun)

теперь посмотрите на свои data.frames.

> oh6_1
   SecurityName  v
1             A  1
2             B  2
3             C  3
4             D  4
5             E  5
6             F  6
7             G  7
8             H  8
9             I  9
10            J 10
11            K 11
12            L 12
13            M 13
14            N 14
15            O 15
16            P 16
17            Q 17
18            R 18
19            S 19
20            T 20
> 
person Justin    schedule 19.06.2012
comment
Джастин, я просто попытался реализовать ваше решение, но toupper () не остается. Он выводит правильные результаты на консоль, но оригинал не перезаписывается (т. Е. Я просматриваю свою рабочую область в RStudio, и это тот же файл, когда я просматриваю () его). Какие-либо предложения? - person Brad; 20.06.2012
comment
Кроме того, на консоль выводится только первый data.frame - не все три. Я запутался больше, чем когда-либо ... - person Brad; 20.06.2012
comment
Спасибо - я очень ценю это. - person Brad; 20.06.2012