Когда я использую eval с агрегатом, я теряю имена переменных - PullRequest
2 голосов
/ 11 октября 2011

У меня есть немного кода, который объединяет данные:

pivot.present.RT <- with(
  subset(correct.data, relevantTarget == 1),
  aggregate(
    data.frame(RT = RT),
    list(
      identifier = identifier,
      set.size = relevantSS,
      stimulus = stimulus
      ),
    mean
    )
  )

Я хотел бы сделать это более гибким, указав различные имена столбцов, чтобы заменить "релевантный SS".Я думал, что смогу сделать это с помощью eval:

set.size.options <- c("relevantSS","irrelevantSS")
pivot.present.RT <- with(
  subset(correct.data, relevantTarget == 1),
  aggregate(
    data.frame(RT = RT),
    list(
      identifier = identifier,
      eval(parse(text = paste("set.size = ", set.size.options[relevant.index]))),
      stimulus = stimulus
      ),
    mean
    )
  )

Однако, когда я запускаю второй бит кода, хотя он правильно агрегирует данные, я теряю имя переменной "set.size".Если я вызываю str, я получаю вывод примерно так:

'data.frame':   48 obs. of  4 variables:
 $ identifier: Factor w/ 9 levels "aks","ejr","ejr3",..: 1 2 4 5 6 7 8 9 1 2 ...
 $ Group.2   : int  4 4 4 4 4 4 4 4 8 8 ...
 $ stimulus  : Factor w/ 2 levels "moving","stationary": 1 1 1 1 1 1 1 1 1 1 ...
 $ RT        : num  1161 1026 1257 1264 1324 ...

Если я запускаю оригинальный код, он правильно определяет вторую переменную как "set.size".

Любая идеямне здесь не хватает?

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Я думаю, get может быть более подходящим, чем eval / parse.

set.size.options <- c("relevantSS","irrelevantSS")
pivot.present.RT <- with(
  subset(correct.data, relevantTarget == 1),
  aggregate(
    data.frame(RT = RT),
    list(
      identifier = identifier,
      set.size = get(set.size.options[relevant.index]),
      stimulus = stimulus
      ),
    mean
    )
  )

Тем не менее, я бы предпочел что-то вроде этого:

d2 <- subset(correct.data, relevantTarget == 1)
doby <- subset(d2, select=c("identifier", set.size.options[relevant.index], "stimulus"))
names(doby) <- c("identifier", "set.size", "stimulus")
aggregate(d2[,"RT",drop=FALSE], doby, mean)

И другие, несомненно, присоединятся к plyr решениям ...

1 голос
/ 11 октября 2011

Поместите имя переменной группировки вне eval(parse(...)), например:

set.size.options <- c("relevantSS","irrelevantSS")
pivot.present.RT <- with(
  subset(correct.data, relevantTarget == 1),
  aggregate(
    data.frame(RT = RT),
    list(
      identifier = identifier,
      set.size = eval(parse(text = set.size.options[relevant.index])),
      stimulus = stimulus
      ),
    mean
    )
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...