2011-10-11 52 views
2

我有一些代碼,其聚合數據:當我使用eval與骨料,我失去了變量名

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

我想通過指定不同的列名取的地方,使這種更靈活「relevantSS」。我以爲我可以用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」。如果我叫海峽,我得到的輸出是這樣的:

'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」。

任何想法我在這裏失蹤?

回答

1

把分組變量名以外的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 
    ) 
) 
+0

啊,是的,這工作插入內容。謝謝! –

3

我想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解決方案...

+0

+1是的,我應該建議替代'eval' /'parse'。 – joran

+0

謝謝。我使用了eval/parse,因爲我更熟悉MATLAB,它有一個eval函數。在這裏看起來更簡單一些。 –

+0

歡迎來到R!關於R中的'parse',庫(fortune);運氣(106)'通常是很好的建議。 – Aaron