Dplyr menghitung mean dan varians tanpa semua data

Saya memiliki kumpulan data yang dimulai seperti berikut:

set.seed(50)
n <- 20
s_num <- c(10,20,30)
counts <- c(0,1,2,3,4)

strata <- sample(s_num, n, replace=T)
sites <- seq(1, n, by=1)
observed <- sample(counts, n, replace=T)

df <- as.data.frame(cbind(strata,sites,observed))

Saya dapat mengelompokkan berdasarkan strata dan mendapatkan mean dan varians menggunakan dplyr dengan:

library(dplyr)
df2 <- df %>%
  group_by(strata) %>%
  summarise(mcount = mean(observed),
            varcount = var(observed))

Masalahnya adalah 0 hitungan tidak lagi ada di database:

df3 <- subset(df,observed != 0)

Jadi mean dan variansnya sekarang tidak benar:

df4 <- df3 %>%
  group_by(strata) %>%
  summarise(mcount = mean(observed),
            varcount = var(observed))

Tapi saya punya jumlah situs:

site_count <- df %>%
  group_by(strata) %>%
  summarise(count_plot = n_distinct(sites))

Apakah saya masih bisa menggunakan dplyr untuk menghitung varians rata-rata tanpa angka 0? Mean sebenarnya tidak terlalu sulit dengan menggabungkan jumlah situs menjadi df; varians lebih sulit. Saya dapat menambahkan kembali 0 baris jika diperlukan, tetapi ingin melihat apakah ada cara sederhana untuk mengatasinya jika memungkinkan. Terima kasih.


person tjr    schedule 20.06.2018    source sumber


Jawaban (3)


Anda dapat menghitung mean dan varians secara manual dari rumus, setelah count_plot menghitungnya.

Varians dihitung sebagai sum((x - mean(x))^2)/(length(x) - 1)

df3 %>% 
  left_join(site_count) %>% 
  group_by(strata) %>%
  summarise(N        = unique(count_plot),
            mcount   = sum(observed)/N,
            varcount = sum((observed - mcount)^2, (N - n())*mcount^2)/(N - 1)) %>% 
  select(-N)


# # A tibble: 3 x 3
#   strata mcount varcount
#    <dbl>  <dbl>    <dbl>
# 1   10.0   1.89    0.861
# 2   20.0   1.33    1.07 
# 3   30.0   2.40    2.30 

Yang cocok dengan df2

df2

# A tibble: 3 x 3
  strata mcount varcount
   <dbl>  <dbl>    <dbl>
1   10.0   1.89    0.861
2   20.0   1.33    1.07 
3   30.0   2.40    2.30 
person IceCreamToucan    schedule 20.06.2018
comment
Terima kasih banyak. Saya tidak yakin apakah sum(()) akan berfungsi untuk setiap baris tetapi ini berhasil. - person tjr; 20.06.2018

Anda dapat menambahkan filter ke saluran pipa Anda.

df2 <- df %>%
 filter(observed != 0) %>%
 group_by(strata) %>%
 summarise(mcount = mean(observed),
          varcount = var(observed))

Dengan cara ini Anda tidak perlu membuat kerangka data perantara.

person Adarsh Chavakula    schedule 20.06.2018
comment
Yang ini lebih elegan - person akrun; 20.06.2018
comment
Dari apa yang saya tahu, pertanyaannya adalah bagaimana cara menghitung mean dan varians tanpa menggunakan df - person IceCreamToucan; 20.06.2018
comment
Ya, maaf saya tidak jelas. Saya tidak memiliki df asli dalam kasus ini. - person tjr; 20.06.2018

Kita dapat membuat kondisi logis untuk disubset

df %>%
   mutate(ind = observed != 0) %>%
   group_by(strata) %>%
   summarise(mcount = mean(observed[ind]), varcount = var(observed[ind]))
# A tibble: 3 x 3
#  strata mcount varcount
#   <dbl>  <dbl>    <dbl>
#1     10   1.89    0.861
#2     20   1.6     0.8  
#3     30   3       0.667

CATATAN: Menggunakan as.data.frame(cbind tidak disarankan karena cbind dapat mengubahnya menjadi matrix (matriks hanya dapat menampung satu kelas) dan ini akan menghasilkan semua kolom factor atau character dengan as.data.frame (jika ada kolom karakter). Sebagai gantinya gunakan data.frame(strata, sites, observed)

person akrun    schedule 20.06.2018