Chcę użyć ddply (), aby zastosować te same funkcje do różnych kolumn, które są kolejno nazywane; na przykład. a, b, c. Aby to zrobić, zamierzam wielokrotnie przekazywać nazwę kolumny jako ciąg znaków i użyć wartości eval (parsowanie (tekst = nazwa_kolumny)), aby funkcja mogła się do niej odwoływać. Wykorzystałem tę technikę z innej odpowiedzi. I to działa dobrze, dopóki nie wstawię ddply () wewnątrz innej funkcji. Oto przykładowy kod:
# Wymagane pakiety:
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")
#To działa.
ColName = "a"
ddply(df, sv, summarize,
Ave = mean(eval(parse(text=ColName)), na.rm=TRUE)
)
#To nie działa
#Wyświetla się error: "Error in parse(text = NewColName) : object 'NewColName' not found"
myFunction(df,sv)
#Dane wyjściowe w obu przypadkach powinny wynosić
# b Ave
#1 0 1.5
#2 1 3.5
Czy ktos mógłby wskazać mi gdzie popełniam błąd?
1 odpowiedź
Możesz to zrobić za pomocą kombinacji do.call
i call
, aby utworzyć wywołanie w środowisku, w którym NewColName
jest nadal widoczny:
myFunction <- function(x,y){
NewColName <- "a"
z <- do.call("ddply",list(x, y, summarize, Ave = call("mean",as.symbol(NewColName),na.rm=TRUE)))
return(z)
}
myFunction(d.f,sv)
b Ave
1 0 1.5
2 1 3.5