2013-04-23 38 views
10

benzersiz değerleri Sayısı Şöyle R verileri:R: kategori

Cnty Yr Plt  Spp DBH Ht Age 
1 185 1999 20001 Bitternut 8.0 54 47 
2 185 1999 20001 Bitternut 7.2 55 50 
3 31 1999 20001 Pignut 7.4 71 60 
4 31 1999 20001 Pignut 11.4 85 114 
5 189 1999 20001  WO 14.5 80 82 
6 189 1999 20001  WO 12.1 72 79 

I her il (Cnty) içinde benzersiz türlerinin (SPP) miktarını öğrenmek istiyorum. "benzersiz (dfname $ Spp)", veri çerçevesindeki toplam benzersiz tür sayısını verir, ancak ilçeden bunu isterim.

Herhangi bir yardım için teşekkür ederiz! Garip formatlama için özür dilerim, bu SO hakkındaki ilk sorum.

Teşekkürler.

+0

hoş geldiniz SO. Daha önce ne denediğiniz ve sorun yaşadığınız yer hakkında daha fazla bilgi paylaşmak daha iyi cevaplar verecektir. Ancak, başlamanıza yardımcı olmak için 'aggregate' ve 'tapply' gibi işlevler yardımcı olabilir. Yardım metnini '? aggregate' kullanarak bir işlevden hatırlamayı unutmayın. – Justin

cevap

2

Justin'in belirttiği gibi, muhtemelen istediğiniz gibi. Eğer veri çerçevenizi foo olarak adlandırırsanız, o zaman aşağıdakiler ne istediğinizi, yani Butternut'lu her bir satırın butternut türlerine ait eşsiz bir bireyi temsil ettiği varsayımıyla tür başına düşen kişi sayısını vermelidir. Her türe ait bireylerin sayısının (satır), yani vektör uzunluğunu hesaplamak için foo $ Yaş kullanılan Not, ancak foo $ Ht veya foo $ DBH vb

aggregate(foo$Age, by = foo[c('Spp','Cnty')], length) 

Cheers kullanabilirsiniz,

Danny

15

Örnek verilerinizi biraz daha ilginç hale getirmeye çalıştım. Örnek verileriniz şu anda "Cnty" başına yalnızca bir "Spp" ye sahip.

set.seed(1) 
mydf <- data.frame(
    Cnty = rep(c("185", "31", "189"), times = c(5, 3, 2)), 
    Yr = c(rep(c("1999", "2000"), times = c(3, 2)), 
     "1999", "1999", "2000", "2000", "2000"), 
    Plt = "20001", 
    Spp = sample(c("Bitternut", "Pignut", "WO"), 10, replace = TRUE), 
    DBH = runif(10, 0, 15) 
) 
mydf 
# Cnty Yr Plt  Spp  DBH 
# 1 185 1999 20001 Bitternut 3.089619 
# 2 185 1999 20001 Pignut 2.648351 
# 3 185 1999 20001 Pignut 10.305343 
# 4 185 2000 20001  WO 5.761556 
# 5 185 2000 20001 Bitternut 11.547621 
# 6 31 1999 20001  WO 7.465489 
# 7 31 1999 20001  WO 10.764278 
# 8 31 2000 20001 Pignut 14.878591 
# 9 189 2000 20001 Pignut 5.700528 
# 10 189 2000 20001 Bitternut 11.661678 

Sonraki, önerildiği gibi, tapply burada iyi bir adaydır. Aradığınız verileri almak için unique ve length'u birleştirin. Basit çizelgesinde ilgilendiğiniz (değil benzersiz değerlerin) ise

with(mydf, tapply(Spp, Cnty, FUN = function(x) length(unique(x)))) 
# 185 189 31 
# 3 2 2 
with(mydf, tapply(Spp, list(Cnty, Yr), FUN = function(x) length(unique(x)))) 
#  1999 2000 
# 185 2 2 
# 189 NA 2 
# 31  1 1 

, o zaman table ve ftable keşfedebilirsiniz:

with(mydf, table(Spp, Cnty)) 
#   Cnty 
# Spp   185 189 31 
# Bitternut 2 1 0 
# Pignut  2 1 1 
# WO   1 0 2 
ftable(mydf, row.vars="Spp", col.vars=c("Cnty", "Yr")) 
#   Cnty 185  189  31  
#   Yr 1999 2000 1999 2000 1999 2000 
# Spp           
# Bitternut   1 1 0 1 0 0 
# Pignut   2 0 0 1 0 1 
# WO    0 1 0 0 2 0 
+0

Ananda: Çok iyi cevap! İlçe başına birden fazla türün var olduğunu doğru olarak tahmin ettiniz, bu tam olarak benim ihtiyacım olan şeydi. Yardımın için çok teşekkürler. –

+0

@KlausLouis, Bunu duyduğuma sevindim. Bu veya diğer cevaplardan herhangi biri yardımcı olsaydı, onları yükseltmeyi ve/veya [kabul etmeyi] düşünün (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) onlar. Teşekkürler ve Stack Overflow'a hoş geldiniz! :) – A5C1D2H2I1M1N2O1R2T1

0
with(mydf, tapply(Spp, list(Cnty, Yr), 
    FUN = function(x) length(unique(x)))) 

benzersiz sorgu büyük veri seti ile çalışmıyor i ortalama veri 1000 k satırdan fazladır.

0

A Handcart And Mohair'in bahsettiği şeyi eklemek istedim. ...

with(mydf, table(Spp, Cnty)) 
#   Cnty 
# Spp   185 189 31 
# Bitternut 2 1 0 
# Pignut  2 1 1 
# WO   1 0 2 
ftable(mydf, row.vars="Spp", col.vars=c("Cnty", "Yr")) 
#   Cnty 185  189  31  
#   Yr 1999 2000 1999 2000 1999 2000 
# Spp           
# Bitternut   1 1 0 1 0 0 
# Pignut   2 0 0 1 0 1 
# WO    0 1 0 0 2 0 

(R stüdyoda yararlı) bir veri çerçevesi içine aşağıdaki kod sonuç almak isteyen o sizin için Önde as.data.frame.matrix değiştirici koymak gerekir böylece gibi kod: Ben bu yazı üzerine geldiğinde

as.data.frame.matrix(with(mydf, table(Spp, Cnty))) 

Ben R oldukça yeni olduğunu ve bu anlamaya bana uzun zaman aldı, bu yüzden ben paylaşmak istedim.

0

data.table yaklaşımını kullanarak basit bir çözüm. durumunda

library(data.table) 

output <- setDT(mydf)[ , .(count=.N) , by = .(Spp,Cnty)] 

daha hoş bir tablo biçime çıktısını yeniden şekillendirmek istiyorum:

library(tidyr) 

spread(data=a, key =Spp, count) 

# Cnty Bitternut Pignut WO 
# 1: 185   2  2 1 
# 2: 189   1  1 NA 
# 3: 31  NA  1 2 

# or perhaps like this: 

spread(data=a, key =Cnty, count) 

#   Spp 185 189 31 
# 1: Bitternut 2 1 NA 
# 2: Pignut 2 1 1 
# 3:  WO 1 NA 2 
0

Biz şimdi bu kolaylaştırmak için taksitli fonksiyonunu kullanabilirsiniz.

tally(group_by(mydf, Spp, Cnty)) 

     Spp Cnty  n 
    <fctr> <fctr> <int> 
1 Bitternut 185  2 
2 Bitternut 189  1 
3 Pignut 185  2 
4 Pignut 189  1 
5 Pignut  31  1 
6  WO 185  1 
7  WO  31  2 

0
set.seed(1) 
mydf <- data.frame(
    Cnty = rep(c("185", "31", "189"), times = c(5, 3, 2)), 
    Yr = c(rep(c("1999", "2000"), times = c(3, 2)), 
     "1999", "1999", "2000", "2000", "2000"), 
    Plt = "20001", 
    Spp = sample(c("Bitternut", "Pignut", "WO"), 10, replace = TRUE), 
    DBH = runif(10, 0, 15) 
) 
mydf 

dplyr::count() fonksiyonu basit bir çözüm gibi görünür:

library(dplyr) 
count(mydf, Spp, Cnty) 
# A tibble: 7 x 3 
# Spp  Cnty  n 
# <fct>  <fct> <int> 
# 1 Bitternut 185  2 
# 2 Bitternut 189  1 
# 3 Pignut 185  2 
# 4 Pignut 189  1 
# 5 Pignut 31  1 
# 6 WO  185  1 
# 7 WO  31  2 
İlgili konular