domanda merito sapply / plyr sintassi: come passare i valori delle variabili di una funzione

StackOverflow https://stackoverflow.com/questions/4808657

  •  24-10-2019
  •  | 
  •  

Domanda

C'è un modo per passare un valore variabile nel ddply / sapply direttamente a una funzione senza la notazione di funzione (x)?

es. Invece di: ddply (bu,. (trial), la funzione (x) print (x $ groviglio))

C'è un modo per farlo: ddply (bu,. (trial), stampa (groviglio))

Chiedo perché con molte variabili questa notazione diventa molto ingombrante.

Grazie!

È stato utile?

Soluzione

Basta aggiungere i tuoi parametri di funzione nel comando ** strati. Ad esempio:

ddply(my_data, c("var1","var2"), my_function, param1=something, param2=something)

dove my_function di solito appare come

my_function(x, param1, param2)

Ecco un esempio di lavoro di questo:

require(plyr)

n=1000
my_data = data.frame(
    subject=1:n, 
    city=sample(1:4, n, T), 
    gender=sample(1:2, n, T), 
    income=sample(50:200, n, T)
    )


my_function = function(data_in, dv, extra=F){
    dv = data_in[,dv]
    output = data.frame(mean=mean(dv), sd=sd(dv))
    if(extra) output = cbind(output,  data.frame(n=length(dv), se=sd(dv)/sqrt(length(dv)) )  )
    return(output)
}

#with params
ddply(my_data, c("city", "gender"), my_function, dv="income", extra=T)

  city gender     mean       sd   n       se
1    1      1 127.1158 44.64347  95 4.580324
2    1      2 125.0154 44.83492 130 3.932283
3    2      1 130.3178 41.00359 107 3.963967
4    2      2 128.1608 43.33454 143 3.623816
5    3      1 121.1419 45.02290 148 3.700859
6    3      2 120.1220 45.01031 123 4.058443
7    4      1 126.6769 38.33233 130 3.361968
8    4      2 125.6129 44.46168 124 3.992777

#without params
ddply(my_data, c("city", "gender"), my_function, dv="income", extra=F)

  city gender     mean       sd
1    1      1 127.1158 44.64347
2    1      2 125.0154 44.83492
3    2      1 130.3178 41.00359
4    2      2 128.1608 43.33454
5    3      1 121.1419 45.02290
6    3      2 120.1220 45.01031
7    4      1 126.6769 38.33233
8    4      2 125.6129 44.46168
scroll top