Dplyr: Pertahankan grup dengan panjang nol

Dibuat pada 20 Mar 2014  ·  44Komentar  ·  Sumber: tidyverse/dplyr

http://stackoverflow.com/questions/22523131

Tidak yakin seperti apa antarmuka ini - mungkin seharusnya default drop = FALSE.

feature wip

Komentar yang paling membantu

+1 - ini adalah pemecah kesepakatan untuk banyak analisis

Semua 44 komentar

Terima kasih telah membuka masalah ini Hadley.

:+1: mengalami masalah yang sama hari ini, drop = FALSE akan sangat membantu saya!

Adakah gagasan tentang kerangka waktu untuk menempatkan setara .drop = FALSE ke dalam dplyr? Saya membutuhkan ini untuk rCharts tertentu agar dapat dirender dengan benar.

Sementara itu saya BENAR-BENAR mendapatkan jawabannya di tautan Anda untuk bekerja.
http://stackoverflow.com/questions/22523131

Saya mengelompokkan berdasarkan dua variabel.

+1 untuk opsi untuk tidak menjatuhkan grup kosong

Mungkin ada yang tumpang tindih dengan #486 dan #413.

Tidak menjatuhkan grup kosong akan sangat berguna. Sering dibutuhkan saat membuat tabel ringkasan.

+1 - ini adalah pemecah kesepakatan untuk banyak analisis

Saya setuju dengan semua hal di atas--akan sangat berguna.

@romainfrancois Saat ini build_index_cpp() tidak menghormati atribut drop:

t1 <- data_frame(
  x = runif(10),
  g1 = rep(1:2, each = 5),
  g2 = factor(g1, 1:3)
)
g1 <- grouped_df(t1, list(quote(g2)), drop = FALSE)
attr(g1, "group_size")
# should be c(5L, 5L, 0L)
attr(g1, "indices")
# shoud be list(0:4, 5:9, integer(0))

Atribut drop hanya berlaku saat mengelompokkan berdasarkan faktor, dalam hal ini kita perlu memiliki satu grup per level faktor, terlepas dari apakah level tersebut benar-benar berlaku untuk data atau tidak.

Ini juga akan mempengaruhi kata kerja tabel tunggal dengan cara berikut:

  • select() : tidak berpengaruh
  • arrange() : tidak berpengaruh
  • summarise() : fungsi yang diterapkan ke grup baris nol harus diberikan bilangan bulat tingkat 0. n() harus mengembalikan 0, mean(x) harus mengembalikan NaN
  • filter() : kumpulan grup harus tetap konstan, bahkan jika beberapa grup sekarang tidak memiliki baris
  • mutate() : tidak perlu mengevaluasi ekspresi untuk grup kosong

Pada akhirnya, drop = FALSE akan menjadi default, dan jika sulit untuk menulis cabang drop = FALSE dan drop = TRUE , saya akan dengan senang hati menghentikan dukungan untuk drop = FALSE ( karena Anda selalu dapat mengatur ulang sendiri faktor tersebut, atau menggunakan vektor karakter sebagai gantinya).

Apakah itu masuk akal? Jika banyak pekerjaan, kita bisa mendorong ke 0,4

@statwonk , @wsurles , @jennybc , @slackline , @mcfrank , @eipi10 Jika Anda ingin membantu, hal terbaik yang harus dilakukan adalah mengerjakan serangkaian kasus uji yang melatih semua cara kata kerja yang berbeda dapat berinteraksi dengan kelompok panjang nol.

Ah. Saya pikir saya tidak tahu apa yang seharusnya dilakukan drop . Itu membuatnya jelas. Saya tidak berpikir itu banyak pekerjaan.

Saya telah membuka permintaan tarik #833 yang menguji apakah kata kerja tabel tunggal di atas menangani grup dengan panjang nol dengan benar. Sebagian besar tes dikomentari, karena dplyr saat ini gagal, tentu saja.

+1 , apakah ada pembaruan status di sini? ringkasan cinta, perlu menjaga level kosong!

@ebergelson , Inilah peretasan saya saat ini untuk mendapatkan grup tanpa panjang. Saya sering membutuhkan ini sehingga diagram batang saya akan menumpuk.

Di sini df memiliki 3 kolom: nama, grup, dan metrik

df2 <- expand.grid(name = unique(df$name), group = unique(df$group)) %>%
    left_join(df, by=c("name","group")) %>%
    mutate(metric = ifelse(is.na(metric),0,metric))

Saya melakukan hal serupa–periksa grup yang hilang, lalu jika ada, buat semua kombinasi dan left_join .

Sayangnya, sepertinya masalah ini tidak mendapatkan banyak cinta ... mungkin karena ada solusi langsung ini.

@wsurles , @bpbond terima kasih, ya saya menggunakan solusi yang mirip dengan apa yang Anda sarankan! ingin melihat perbaikan bawaan seperti .drop.

Sekedar menambahkan dan setuju dengan semua orang di atas - ini adalah aspek yang sangat penting dari banyak analisis. Akan senang melihat implementasinya.

Beberapa detail lebih lanjut diperlukan di sini:

Jika saya memiliki ini:

> df <- data_frame( x = c(1,1,1,2,2), f = factor( c(1,2,3,1,1) ) )
> df
Source: local data frame [5 x 2]

  x f
1 1 1
2 1 2
3 1 3
4 2 1
5 2 1

Dan saya mengelompokkan berdasarkan x lalu f , saya akan berakhir dengan 6 (2x3) grup di mana grup (2, 2) dan (2,3) kosong. Tidak apa-apa. Saya dapat mengatur untuk menerapkan yang saya pikir.

sekarang, bagaimana jika saya memiliki ini:

> df <- data_frame( f = factor( c(1,1,2,2), levels = 1:3), x = c(1,2,1,4) )
> df
Source: local data frame [4 x 2]

  f x
1 1 1
2 1 2
3 2 1
4 2 4

dan saya ingin mengelompokkan berdasarkan f lalu x . Apa yang akan menjadi kelompok? @hadley

Baik stats::aggregate dan plyr::ddply mengembalikan 4 grup dalam kasus ini (1,1; 1,2; 2,1; dan 2,4), jadi saya sarankan itulah perilaku yang harus dipatuhi .

Bukankah seharusnya itu setuju dengan table() sebagai gantinya, yaitu, mengembalikan 9 grup?

> table(df$f, df$x)
  1 2 4
1 1 1 0
2 1 0 1
3 0 0 0

Saya berharap df %>% group_by(f, x) %>% tally pada dasarnya memberikan hasil yang sama dengan with(df, as.data.frame(table(f, x))) dan ddply(df, .(f, x), nrow, .drop=FALSE) .

Saya pikir perilaku yang kami inginkan adalah mempertahankan grup tanpa panjang jika itu adalah faktor (seperti .drop in plyr), jadi saya akan membayangkan kami menginginkan saran @huftis . Saya akan menyarankan bahwa defaultnya adalah drop = TRUE, sehingga perilaku default tidak berubah, ulangi saran

Hmmm, sulit untuk memahami persis seperti apa perilaku yang seharusnya. Apakah eksperimen pemikiran yang sangat sederhana ini terlihat benar?

df <- data_frame(x = 1, y = factor(1, levels = 2))
df %>% group_by(x) %>% summarise(n())
#> x n
#> 1 1  

df %>% group_by(y) %>% summarise(n())
#> y n
#> 1 1
#> 2 0

df %>% group_by(x, y) %>% summarise(n()
#> x y n
#> 1 1 1
#> 1 2 0

Tetapi bagaimana jika x memiliki banyak nilai? Haruskah bekerja seperti ini?

df <- data_frame(x = 1:2, y = factor(1, levels = 2))
df %>% group_by(x, y) %>% summarise(n()
#> x y n
#> 1 1 1
#> 2 1 1
#> 1 1 0
#> 2 2 0

Mungkin melestarikan grup kosong hanya masuk akal ketika dikelompokkan berdasarkan satu variabel? Jika kita membingkainya secara lebih realistis, misalnya data_frame(age_group = c(40, 60), sex = factor(M, levels = c("F", "M")) apakah Anda benar-benar menginginkan hitungan untuk wanita? Saya pikir kadang-kadang Anda mau dan kadang-kadang tidak. Memperluas semua kombinasi tampak seperti operasi yang agak berbeda bagi saya (dan tidak tergantung pada penggunaan faktor).

Mungkin group_by membutuhkan argumen drop dan expand ? drop = FALSE akan menyimpan semua grup ukuran nol yang dihasilkan oleh tingkat faktor yang tidak muncul dalam data. expand = TRUE akan menyimpan semua grup ukuran nol yang dihasilkan oleh kombinasi nilai yang tidak muncul dalam data.

@hadley Contoh Anda terlihat tepat bagi saya (dengan asumsi maksud Anda levels = 1:2 , bukan levels = 2 ). Dan saya pikir melestarikan grup kosong masuk akal bahkan ketika dikelompokkan berdasarkan beberapa variabel. Misalnya, jika variabelnya adalah sex ( male dan female ) dan answer (pada kuesioner, dengan level disagree , neutral , agree ), dan Anda ingin menghitung frekuensi setiap jawaban untuk setiap jenis kelamin (misalnya untuk tabel, atau untuk plot selanjutnya), Anda tidak ingin membuang kategori jawaban saja karena tidak ada wanita yang menjawabnya.

Saya juga mengharapkan variabel faktor untuk tetap menjadi variabel faktor dalam data_frame dihasilkan (tidak dikonversi ke string), dan dengan _level asli_. (Jadi ketika memplot data, kategori jawaban akan berada dalam urutan yang benar, bukan abjad agree , disagree , neutral ).

Untuk contoh terakhir Anda, _dalam beberapa kasus_ wajar untuk menghilangkan variabel sex (misalnya, jika _sengaja_ tidak ada perempuan yang disurvei), dan _dalam kasus lain_ tidak (misalnya, saat menghitung jumlah cacat lahir yang dikelompokkan berdasarkan jenis kelamin (dan mungkin tahun)). Tapi ini bisa (dan harus) dengan mudah ditangani dengan _after_ menggabungkan data. (Solusi yang berbeda adalah menerima argumen _vector-valued_ .drop . Itu akan menyenangkan, tapi saya rasa itu mungkin memperumit masalah?)

(Solusi yang berbeda adalah menerima argumen .drop bernilai vektor. Itu akan menyenangkan, tapi saya kira itu mungkin memperumit masalah?)

Ya, mungkin terlalu rumit. Kalau tidak, saya setuju dengan komentar @huftis .

@hadley
Menurut saya
YA perluas semua kombinasi nilai ke group_by jika ada dalam data.
TIDAK tidak memperluas tingkat faktor yang tidak ada.

Kasus penggunaan saya yang paling sering adalah menyiapkan sekumpulan data ringkasan untuk bagan (selama eksplorasi). Dan grafik harus memiliki semua kombinasi nilai. Tetapi mereka tidak perlu memiliki tingkat faktor yang memiliki 0 untuk semua grup.. misalnya Anda tidak dapat menumpuk diagram batang tanpa semua kombinasi. Tetapi Anda tidak memerlukan nilai faktor yang tidak ada dalam data, ini hanya akan menjadi 0 saat ditumpuk dan nilai kosong dalam legenda.

Saya percaya memperluas semua nilai ke group_by harus menjadi default karena jauh lebih mudah (dan jauh lebih intuitif) untuk memfilter 0 kasus setelah grup jika diperlukan. Saya tidak berpikir argumen .drop diperlukan, karena cukup mudah untuk memfilter 0 kasus setelahnya. Kami tidak menggunakan argumen tambahan untuk salah satu fungsi lain sehingga ini akan merusak cetakan. Standarnya seharusnya hanya menampilkan hasil untuk semua kombo dari nilai yang ada berdasarkan group_by.

Saya pikir ini akan menjadi perilaku default yang benar. Di sini keunikan hanya akan berkembang pada nilai yang ada dalam faktor, tidak semua level faktor. (Ini yang saya jalankan setelah menjalankan group_by yang menurunkan 0 nilai)

## Expand data so plot groups works correctly
  df2 <- expand.grid(name = unique(df$name), group = unique(df$group)) %>%
    left_join(df, by=c("name","group")) %>%
    mutate(
      measure = ifelse(is.na(measure),0,measure)
    )

Satu-satunya kasus yang saya dapat melihat di mana Anda menginginkan nilai meskipun semua grup memiliki nol adalah dengan data waktu. Mungkin satu hari data hilang di suatu tempat di tengah. Di sini perluas dan gabung pada rentang tanggal. Kasus tingkat faktor tidak akan berlaku. Saya pikir adil bagi pengolah data untuk menangani tanggal yang hilang sendiri.

Terima kasih atas semua pekerjaan hebat Anda di perpustakaan ini. 90% pekerjaan saya menggunakan dplyr. :)

Saya sangat setuju dengan @huftis.

Saya tidak berpikir penurunan level atau kombinasi level harus ada hubungannya dengan data. Anda mungkin membuat prototipe fungsi atau gambar menggunakan sampel kecil. Atau melakukan operasi split-apply-combine, dalam hal ini Anda menginginkan jaminan bahwa output dari setiap grup akan sesuai dengan yang lainnya.

Memperhalus posisi saya: Saya pikir perlu mempertimbangkan apakah perilaku default harus berbeda ketika variabel pengelompokan sudah menjadi faktor yang tepat vs. ketika sedang dipaksa untuk menjadi faktor. Saya dapat melihat bahwa kewajiban untuk menjaga level yang tidak digunakan mungkin kurang dalam kasus pemaksaan. Tetapi jika saya telah bersusah payah untuk mengatur sesuatu sebagai faktor dan mengendalikan level ... biasanya ada alasan bagus dan saya tidak ingin terus-menerus berjuang untuk mempertahankannya.

FYIW, saya juga ingin melihat fitur ini. Saya memiliki skenario serupa seperti yang dijelaskan oleh @huftis dan harus melewati rintangan untuk mendapatkan hasil yang saya butuhkan.

Datang ke sini dari SO. Bukankah ini yang seharusnya dibantu oleh complete dari "tidyr"?

Ya itu tidak. Saya sebenarnya baru belajar tentang 'lengkap' baru-baru ini dan tampaknya menyelesaikan ini dengan cara yang bijaksana.

Menerapkannya untuk backend SQL terlihat sulit, karena mereka secara default akan menghapus semua grup. Haruskah kita membiarkannya begitu saja dan mungkin mengimplementasikan rapir::complete() untuk SQL?

Saya membuat masalah #3033 tanpa menyadari bahwa masalah ini sudah ada - maaf atas duplikatnya. Untuk menambahkan saran sederhana saya sendiri, saat ini saya menggunakan pull() dan forcats::fct_count() sebagai solusi untuk masalah ini.

Saya bukan penggemar metode ini karena fct_count() mengkhianati prinsip rapi membuat output yang selalu bertipe sama dengan input (yaitu fungsi ini membuat tibble dari vektor), dan saya punya untuk mengganti nama kolom dalam output. Ini menciptakan 3 langkah ( pull() %>% fct_count() %>% rename() ) ketika dplyr::count() dimaksudkan untuk mencakup satu. Akan luar biasa jika forcats::fct_count() dan dplyr::count() entah bagaimana bisa digabungkan, dan tidak digunakan lagi forcats::fct_count() .

Apakah tidyr::complete() bekerja untuk faktor?

Semua tingkat faktor dan kombinasi tingkat faktor harus dipertahankan secara default. Perilaku ini dapat dikontrol oleh parameter seperti drop , expand , dll. Jadi, perilaku default dplyr::count() harus seperti ini:

df <- data.frame(x = 1:2, y = factor(c(1, 1), levels = 1:2))
df %>% dplyr::count(x, y)
#>  # A tibble: 4 x 3
#>       x        y       n
#>     <int>   <fct>    <int>
#> 1     1        1       1
#> 2     2        1       1
#> 3     1        2       0
#> 4     2        2       0

Grup panjang nol (kombinasi grup) dapat difilter nanti. Tetapi untuk analisis eksplorasi kita harus melihat gambaran lengkapnya.

  1. Apakah ada pembaruan status tentang solusi untuk masalah ini?
  2. Apakah ada rencana untuk menyelesaikan masalah ini sepenuhnya?

2: ya pasti
1: Ada beberapa kesulitan implementasi teknis tentang masalah ini, tetapi saya akan memeriksanya dalam beberapa minggu ke depan.

Kami mungkin lolos dengan ini dengan memperluas data setelah fakta, sesuatu seperti ini:

library(tidyverse)

truly_group_by <- function(data, ...){
  dots <- quos(...)
  data <- group_by( data, !!!dots )

  labels <- attr( data, "labels" )
  labnames <- names(labels)
  labels <- mutate( labels, ..index.. =  attr(data, "indices") )

  expanded <- labels %>%
    tidyr::expand( !!!dots ) %>%
    left_join( labels, by = labnames ) %>%
    mutate( ..index.. = map(..index.., ~if(is.null(.x)) integer() else .x ) )

  indices <- pull( expanded, ..index..)
  group_sizes <- map_int( indices, length)
  labels <- select( expanded, -..index..)

  attr(data, "labels")  <- labels
  attr(data, "indices") <- indices
  attr(data, "group_sizes") <- group_sizes

  data
}

df  <- data_frame(
  x = 1:2,
  y = factor(c(1, 1), levels = 1:2)
)
tally( truly_group_by(df, x, y) )
#> # A tibble: 4 x 3
#> # Groups:   x [?]
#>       x y         n
#>   <int> <fct> <int>
#> 1     1 1         1
#> 2     1 2         0
#> 3     2 1         1
#> 4     2 2         0
tally( truly_group_by(df, y, x) )
#> # A tibble: 4 x 3
#> # Groups:   y [?]
#>   y         x     n
#>   <fct> <int> <int>
#> 1 1         1     1
#> 2 1         2     1
#> 3 2         1     0
#> 4 2         2     0

jelas di telepon, ini akan ditangani secara internal, tanpa menggunakan rapi atau mendengkur.

Ini sepertinya menangani pertanyaan awal jadi:

> df = data.frame(a=rep(1:3,4), b=rep(1:2,6))
> df$b = factor(df$b, levels=1:3)
> df %>%
+   group_by(b) %>%
+   summarise(count_a=length(a), .drop=FALSE)
# A tibble: 2 x 3
  b     count_a .drop
  <fct>   <int> <lgl>
1 1           6 FALSE
2 2           6 FALSE
> df %>%
+   truly_group_by(b) %>%
+   summarise(count_a=length(a), .drop=FALSE)
# A tibble: 3 x 3
  b     count_a .drop
  <fct>   <int> <lgl>
1 1           6 FALSE
2 2           6 FALSE
3 3           0 FALSE

Kuncinya di sini adalah ini

 tidyr::expand( !!!dots ) %>%

yang berarti memperluas semua kemungkinan terlepas dari variabel menjadi faktor atau tidak.

Saya akan mengatakan kita juga:

  • perluas semua saat drop=FALSE , berpotensi memiliki banyak 0 grup panjang
  • lakukan apa yang kita lakukan sekarang jika drop=TRUE

mungkin memiliki fungsi untuk mengaktifkan dropness.

Ini adalah operasi yang relatif murah menurut saya karena ini hanya melibatkan manipulasi metadata, jadi mungkin tidak terlalu berisiko untuk melakukan ini di R terlebih dahulu?

Apakah maksud Anda crossing() bukannya expand() ?

Melihat internal, apakah Anda setuju bahwa kita "hanya" perlu mengubah build_index_cpp() , khususnya pembuatan bingkai data labels , untuk mewujudkannya?

Bisakah kita mulai dengan memperluas faktor saja dengan drop = FALSE ? Saya menganggap sintaks "alami", tetapi ini mungkin terlalu membingungkan pada akhirnya (dan mungkin bahkan tidak cukup kuat):

group_by(data, crossing(col1, col2), col3)

Semantik: Menggunakan semua kombinasi col1 dan col2 , dan ada kombinasi dengan col3 .

Ya, saya akan mengatakan ini hanya memengaruhi build_index_cpp dan pembuatan atribut labels , indices dan group_sizes yang ingin saya tekan dalam struktur rapi sebagai bagian dari #3489

Bagian "satu-satunya faktor yang berkembang" dari diskusi ini adalah yang memakan waktu begitu lama.

Apa yang akan menjadi hasil dari ini:

library(dplyr)

d <- data_frame(
  f1 = factor( rep( c("a", "b"), each = 4 ), levels = c("a", "b", "c") ),
  f2 = factor( rep( c("d", "e", "f", "g"), each = 2 ), levels = c("d", "e", "f", "g", "h") ),
  x  = 1:8,
  y  = rep( 1:4, each = 2)
)

f <- function(data, ...){
  group_by(data, !!!quos(...))  %>%
    tally()
}
f(d, f1, f2, x)
f(d, x, f1, f2)

f(d, f1, f2, x, y)
f(d, x, f1, f2, y)

Saya pikir f(d, f1, f2, x) harus memberikan hasil yang sama dengan f(d, x, f1, f2) , jika urutan baris diabaikan. Sama untuk dua lainnya.

Juga menarik:

f(d, f2, x, f1, y)
d %>% sample_frac(0.3) %>% f(...)

Saya suka gagasan menerapkan ekspansi penuh hanya untuk faktor. Untuk data non-karakter (termasuk logika), kita dapat mendefinisikan/menggunakan kelas seperti faktor yang mewarisi tipe data masing-masing. Mungkin disediakan oleh forcats ? Ini membuatnya lebih sulit untuk menembak diri sendiri di kaki.

implementasi sedang berlangsung di #3492

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
df <- data_frame( f = factor( c(1,1,2,2), levels = 1:3), x = c(1,2,1,4) )

( res1 <- tally(group_by(df,f,x, drop = FALSE)) )
#> # A tibble: 9 x 3
#> # Groups:   f [?]
#>   f         x     n
#>   <fct> <dbl> <int>
#> 1 1        1.     1
#> 2 1        2.     1
#> 3 1        4.     0
#> 4 2        1.     1
#> 5 2        2.     0
#> 6 2        4.     1
#> 7 3        1.     0
#> 8 3        2.     0
#> 9 3        4.     0
( res2 <- tally(group_by(df,x,f, drop = FALSE)) )
#> # A tibble: 9 x 3
#> # Groups:   x [?]
#>       x f         n
#>   <dbl> <fct> <int>
#> 1    1. 1         1
#> 2    1. 2         1
#> 3    1. 3         0
#> 4    2. 1         1
#> 5    2. 2         0
#> 6    2. 3         0
#> 7    4. 1         0
#> 8    4. 2         1
#> 9    4. 3         0

all.equal( res1, arrange(res2, f, x) )
#> [1] TRUE

all.equal( filter(res1, n>0), tally(group_by(df, f, x)) )
#> [1] TRUE
all.equal( filter(res2, n>0), tally(group_by(df, x, f)) )
#> [1] TRUE

Dibuat pada 10-04-2018 oleh paket reprex (v0.2.0).

Adapun apakah complete() menyelesaikan masalah - tidak, tidak juga. Apa pun ringkasan yang dihitung, perilakunya pada vektor kosong perlu dipertahankan, bukan ditambal setelah fakta. Sebagai contoh:

data.frame(x=factor(1, levels=1:2), y=4:5) %>%
     group_by(x) %>%
     summarize(min=min(y), sum=sum(y), prod=prod(y))
# Should be:
#> x       min   sum  prod
#> 1         4     9    20
#> 2       Inf     0     1

sum dan prod (dan pada tingkat lebih rendah, min ) (dan berbagai fungsi lainnya) memiliki semantik yang terdefinisi dengan sangat baik pada vektor kosong, dan tidak bagus untuk melakukannya datang setelah itu dengan complete() dan definisikan kembali perilaku tersebut.

@kenahoo Saya tidak yakin saya mengerti. Inilah yang Anda dapatkan dengan versi dev saat ini. Jadi satu-satunya hal yang tidak Anda dapatkan adalah peringatan dari min()

library(dplyr)

data.frame(x=factor(1, levels=1:2), y=4:5) %>%
  group_by(x) %>%
  summarize(min=min(y), sum=sum(y), prod=prod(y))
#> # A tibble: 2 x 4
#>   x       min   sum  prod
#>   <fct> <dbl> <int> <dbl>
#> 1 1         4     9    20
#> 2 2       Inf     0     1

min(integer())
#> Warning in min(integer()): no non-missing arguments to min; returning Inf
#> [1] Inf
sum(integer())
#> [1] 0
prod(integer())
#> [1] 1

Dibuat pada 15-05-2018 oleh paket reprex (v0.2.0).

@romainfrancois Oh keren, saya tidak menyadari bahwa Anda sudah sejauh ini dalam implementasi ini. Tampak hebat!

Masalah lama ini telah dikunci secara otomatis. Jika Anda yakin telah menemukan masalah terkait, harap ajukan masalah baru (dengan reprex) dan tautkan ke masalah ini. https://reprex.tidyverse.org/

Apakah halaman ini membantu?
0 / 5 - 0 peringkat