Ссылки на новые столбцы внутри преобразования - PullRequest
8 голосов
/ 16 июля 2011

У меня есть фрейм данных со столбцами, помеченными A, B и C. Я хочу добавить новые столбцы, которые рассчитываются по существующим столбцам И самим новым столбцам.Чтобы добиться этого, я попытался использовать функцию преобразования следующим образом:

Data = transform(Data,
          NewD = A + B,
          NewE = C * NewD
)

Но это выдает ошибку:

Ошибка в eval (expr, envir, enclos): object 'NewD'not found

Я также попробовал функцию cbind следующим образом:

NewD = Data$A + Data$B,
NewE = Data$C * New$D
Data=cbind(Data,NewD,NewE)

Но она становится громоздкой, когда число дополнительных столбцов (функций) увеличивается.

Как я могу ссылаться на NewD внутри функции преобразования, или есть лучший способ применить несколько функций, подобных этой.Я хочу, чтобы данные содержали столбцы A, B, C, NewD и NewE без необходимости многократного вызова функции преобразования.

Ответы [ 3 ]

6 голосов
/ 16 июля 2011

Может быть, что-то вроде этого

d <- data.frame(a=1:5, b=6:10)
transform(d, c=tmp <- a+b, e=b*tmp)

делает это?

5 голосов
/ 17 июля 2011

Хэдли имеет в своем пакете plyr функцию mutate, которая делает именно это.Вот тот же пример, который использовал @Karsten, используя mutate.Я считаю код mutate более читабельным для таких задач, поскольку он не требует каких-либо временных назначений внутри.

require(plyr)
d = data.frame(a = 1:5, b = 6:10)
mutate(d, c = a + b, d = b * c, e = c * d)
1 голос
/ 17 июля 2011

Вот несколько способов. Проиллюстрируем, используя встроенный фрейм данных BOD:

в

> within(BOD, { a <- Time + 1; b <- a + 1 })
  Time demand b a
1    1    8.3 3 2
2    2   10.3 4 3
3    3   19.0 5 4
4    4   16.0 6 5
5    5   15.6 7 6
6    7   19.8 9 8

my.transform

my.transform определено здесь и позволяет ссылаться на новые столбцы:

> my.transform(BOD, a = Time + 1, b = a + 1)
  Time demand a b
1    1    8.3 2 3
2    2   10.3 3 4
3    3   19.0 4 5
4    4   16.0 5 6
5    5   15.6 6 7
6    7   19.8 8 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...