Pertanyaan dplyr 0.3.0.9000 cara menggunakan lakukan () dengan benar


Mencoba untuk mereproduksi hasil pada pertanyaan SO: dplyr: Bagaimana cara menerapkan () pada hasil group_by?

Ini datanya

person = c('Grace', 'Grace', 'Grace', 'Rob', 'Rob', 'Rob')
foods = c('apple', 'banana', 'cucumber', 'spaghetti', 'cucumber', 'banana')
eaten <- data.frame(person, foods, stringsAsFactors = FALSE)

Hasil yang saya coba tiru adalah:

[[1]]
     [,1]     [,2]       [,3]      
[1,] "apple"  "apple"    "banana"  
[2,] "banana" "cucumber" "cucumber"

[[2]]
     [,1]        [,2]        [,3]      
[1,] "spaghetti" "spaghetti" "cucumber"
[2,] "cucumber"  "banana"    "banana" 

Kode asli yang menghasilkan hasil di atas adalah seperti di bawah ini yang tidak lagi berfungsi:

> eaten %>% group_by(person) %>% do(function(x) combn(x$foods, m = 2))
Error: Results are not data frames at positions: 1, 2

Mencoba beberapa cara untuk menggunakan fungsi do () tidak berhasil.

> eaten %>% group_by(person) %>% do(combn(.$foods, m = 2))
Error: Results are not data frames at positions: 1, 2

> eaten %>% group_by(person) %>% do(.$foods, combn, m =2)
Error: Arguments to do() must either be all named or all unnamed

> eaten %>% group_by(person) %>% do((combn(.$foods, m=2)))
Error: Results are not data frames at positions: 1, 2

Tampaknya hanya satu di bawah ini yang berfungsi dengan pesan peringatan sekalipun:

> eaten %>% group_by(person) %>% do(as.data.frame(combn(.$foods, m = 2)))
#   person        V1        V2       V3
# 1  Grace     apple     apple   banana
# 2  Grace    banana  cucumber cucumber
# 3    Rob spaghetti spaghetti cucumber
# 4    Rob  cucumber    banana   banana
# Warning messages:
# 1: In rbind_all(out[[1]]) : Unequal factor levels: coercing to character
# 2: In rbind_all(out[[1]]) : Unequal factor levels: coercing to character

Percaya harus ada perubahan pada perilaku do () di bawah versi baru. Apa saja perubahannya? Apa idiom / cara yang benar untuk digunakan ()? Terima kasih.

EDIT: Menginstal dplyr terbaru dan menjalankan kode yang disarankan oleh @hadley

packageVersion("dplyr")
[1] ‘0.3.0.2’

eaten %>% group_by(person) %>% do(x = combn(.$foods, m = 2))
# Source: local data frame [2 x 2]
# Groups: <by row>
#   
#   person          x
# 1  Grace <chr[2,3]>
# 2    Rob <chr[2,3]>

EDIT2: Perlu mengekstrak kolom "x" seperti yang disarankan oleh @hadley

eaten2 <- eaten %>% group_by(person) %>% do(x = combn(.$foods, m = 2))
eaten2[["x"]]
# [[1]]
# [,1]     [,2]       [,3]      
# [1,] "apple"  "apple"    "banana"  
# [2,] "banana" "cucumber" "cucumber"
# 
# [[2]]
# [,1]        [,2]        [,3]      
# [1,] "spaghetti" "spaghetti" "cucumber"
# [2,] "cucumber"  "banana"    "banana" 

5
2017-10-13 08:55


asal


Jawaban:


Pindahkan EDIT2 ke Q untuk menjawab untuk menutup pertanyaan:

Untuk terbaru dplyr 0.3.0.2+, perlu mengekstrak kolom "x" seperti yang disarankan oleh @hadley

eaten2 <- eaten %>% group_by(person) %>% do(x = combn(.$foods, m = 2))
eaten2[["x"]]
# [[1]]
# [,1]     [,2]       [,3]      
# [1,] "apple"  "apple"    "banana"  
# [2,] "banana" "cucumber" "cucumber"
# 
# [[2]]
# [,1]        [,2]        [,3]      
# [1,] "spaghetti" "spaghetti" "cucumber"
# [2,] "cucumber"  "banana"    "banana

2
2017-12-30 13:39