To naprawdę zakwestionowało moją zdolność do debugowania kodu R.Nie znaleziono błędu obiektu z ddply wewnątrz funkcji
Chcę użyć ddply()
, aby zastosować te same funkcje do różnych kolumn, które są kolejno nazwane; na przykład. a, b, c. Aby to zrobić, zamierzam wielokrotnie podawać nazwę kolumny jako ciąg znaków i używać funkcji eval(parse(text=ColName))
, aby ta funkcja mogła się do niej odwoływać. Chwyciłem tę technikę z innej odpowiedzi.
To działa dobrze, dopóki nie wstawię ddply()
do innej funkcji. Oto przykładowy kod:
# Required packages:
library(plyr)
myFunction <- function(x, y){
NewColName = "a"
z = ddply(x, y, summarize,
Ave = mean(eval(parse(text=NewColName)), na.rm=TRUE)
)
return(z)
}
a = c(1,2,3,4)
b = c(0,0,1,1)
c = c(5,6,7,8)
df = data.frame(a,b,c)
sv = c("b")
#This works.
ColName = "a"
ddply(df, sv, summarize,
Ave = mean(eval(parse(text=ColName)), na.rm=TRUE)
)
#This doesn't work
#Produces error: "Error in parse(text = NewColName) : object 'NewColName' not found"
myFunction(df,sv)
#Output in both cases should be
# b Ave
#1 0 1.5
#2 1 3.5
Jakieś pomysły? NewColName jest nawet zdefiniowane wewnątrz funkcji!
Pomyślałem, że odpowiedź na to pytanie, loops-to-create-new-variables-in-ddply, może mi pomóc, ale zrobiłem wystarczająco dużo headbangingu na dzisiaj i czas podnieść rękę i poprosić o pomoc.
Podejrzewam, że rozwiązanie może wymagać funkcji @Hadley :-) –
Wysiłek w próbowaniu tych wszystkich. Grupowe uderzenie głową jest zawsze doceniane ...... Zachowam moją duszę. –