Pertanyaan melakukan operasi plyr pada setiap baris frame data di R


Saya suka sintaks plyr. Setiap kali saya harus menggunakan salah satu perintah * apply (), saya akhirnya menendang anjing dan melakukan 3 hari bender. Jadi demi anjing saya dan hati saya, apa sintaks yang ringkas untuk melakukan operasi ddply pada setiap baris frame data?

Berikut ini contoh yang berfungsi dengan baik untuk kasus sederhana:

x <- rnorm(10)
y <- rnorm(10)
df <- data.frame(x,y)
ddply(df,names(df) ,function(df) max(df$x,df$y))

yang berfungsi dengan baik dan memberi saya apa yang saya inginkan. Tetapi jika hal-hal menjadi lebih kompleks ini menyebabkan plyr menjadi funky (dan tidak seperti Bootsy Collins) karena plyr mengunyah membuat "level" dari semua nilai floating point tersebut.

x <- rnorm(1000)
y <- rnorm(1000)
z <- rnorm(1000)
myLetters <- sample(letters, 1000, replace=T)
df <- data.frame(x,y, z, myLetters)
ddply(df,names(df) ,function(df) max(df$x,df$y))

di kotak saya mengunyah ini selama beberapa menit dan kemudian kembali:

Error: memory exhausted (limit reached?)
In addition: Warning messages:
1: In paste(rep(l, each = ll), rep(lvs, length(l)), sep = sep) :
  Reached total allocation of 1535Mb: see help(memory.size)
2: In paste(rep(l, each = ll), rep(lvs, length(l)), sep = sep) :
  Reached total allocation of 1535Mb: see help(memory.size)

Saya pikir saya benar-benar menyalahgunakan plyr dan saya tidak mengatakan ini adalah bug di plyr, tetapi perilaku kasar oleh saya (hati dan anjing).

Jadi singkatnya, apakah ada pintas sintaks untuk menggunakan ddply untuk beroperasi pada setiap baris sebagai pengganti apply(X, 1, ...)?

Solusi yang saya gunakan adalah membuat "kunci" yang memberikan nilai unik untuk setiap baris dan kemudian saya dapat bergabung kembali dengannya.

 x <- rnorm(1000)
 y <- rnorm(1000)
 z <- rnorm(1000)
 myLetters <- sample(letters, 1000, replace=T)
 df <- data.frame(x,y, z, myLetters)
  #make the key
 df$myKey <- 1:nrow(df)
 myOut <- merge(df, ddply(df,"myKey" ,function(df) max(df$x,df$y)))
  #knock out the key
 myOut$myKey <- NULL

Tapi saya terus berpikir bahwa "Harus Ada Cara yang Lebih Baik"

Terima kasih!


32
2018-01-15 20:36


asal


Jawaban:


Perlakukan saja seperti larik dan kerjakan setiap baris:

adply(df, 1, transform, max = max(x, y))

42
2018-01-15 21:17