2013-04-23 11 views
10

द्वारा अनन्य मानों गणना मैं आर कि इस तरह दिखता है में डेटा है:आर: श्रेणी

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 

मैं प्रत्येक काउंटी (Cnty) में अद्वितीय प्रजातियों (एसपीपी) की मात्रा जानना चाहूंगा। "अद्वितीय (dfname $ spp)" मुझे डेटा फ्रेम में अद्वितीय प्रजातियों की कुल गिनती देता है, लेकिन मैं इसे काउंटी द्वारा पसंद करूंगा।

किसी भी मदद की सराहना की जाती है! अजीब प्रारूपण के लिए खेद है, यह एसओ पर मेरा पहला सवाल है।

धन्यवाद।

+0

आपका स्वागत करने के लिए इतना। आपने क्या प्रयास किया है और आप समस्याओं में कहां चल रहे हैं, इसके बारे में और अधिक साझा करना बेहतर उत्तर देगा। लेकिन, आपको प्रारंभ करने के लिए, 'कुल' और 'tapply' जैसे कार्य उपयोगी होंगे। '? कुल' का उपयोग करके फ़ंक्शन से सहायता टेक्स्ट को देखना याद रखें। – Justin

उत्तर

2

जस्टिन का उल्लेख कुल मिलाकर संभवतः आप चाहते हैं। यदि आप अपना डेटा फ्रेम फू कहते हैं, तो निम्नलिखित आपको जो चाहिए वो देना चाहिए, अर्थात् प्रति प्रजातियों की संख्या में यह माना जाता है कि बटरनट के साथ प्रत्येक पंक्ति बटरनट प्रजातियों से संबंधित एक अद्वितीय व्यक्ति का प्रतिनिधित्व करती है। नोट मैं इस्तेमाल किया foo $ आयु, वेक्टर की लंबाई की गणना करने के व्यक्तियों की संख्या (पंक्ति) प्रत्येक प्रजाति से संबंधित यानी, लेकिन आप foo $ एचटी या foo $ DBH आदि

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

चीयर्स इस्तेमाल कर सकते हैं,

डैनी

15

मैंने आपके नमूना डेटा को थोड़ा और दिलचस्प बनाने की कोशिश की है। आपके नमूना डेटा में वर्तमान में केवल एक अद्वितीय "एसपीपी" प्रति "सीएनटीई" है।

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 

अगला, जैसा कि सुझाव दिया गया है, tapply यहां एक अच्छा उम्मीदवार है। जिस डेटा को आप ढूंढ रहे हैं उसे प्राप्त करने के लिए unique और length मिलाएं।

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 

आप सरल सारणीकरण में रुचि रखते हैं (नहीं अद्वितीय मानों की) है, तो आप table और ftable का पता लगाने कर सकते हैं:

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

आनंद: बहुत अच्छा जवाब! आपने सही ढंग से माना है कि प्रति काउंटी की एक से अधिक प्रजातियां मौजूद हैं, जो वास्तव में मुझे जरूरी है। आपकी मदद के लिए बहुत बहुत शुक्रिया। –

+0

@ क्लोस लुइस, इसे सुनकर खुशी हुई। यदि यह या कोई अन्य उत्तर उपयोगी था, तो उन्हें और/या [स्वीकार करने] पर विचार करें (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) में से एक उन्हें। धन्यवाद, और ढेर ओवरफ्लो में आपका स्वागत है! :) – A5C1D2H2I1M1N2O1R2T1

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

अद्वितीय क्वेरी बड़े डेटा सेट के साथ काम नहीं कर रहा मैं 1000k पंक्ति से अधिक डेटा का मतलब है।

0

मैं ए हैंडकार्ट और मोहर के उल्लेख में क्या जोड़ना चाहता था। आप में से जो एक डेटा फ्रेम में नीचे दिए गए कोड का परिणाम पाने के लिए (आर स्टूडियो में उपयोगी) ...

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 

चाहने के लिए आप सामने as.data.frame.matrix संशोधक डालना होगा इसलिए की तरह अपने कोड की:

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

मैं जब मैं इस पोस्ट पर आया सुंदर आर के लिए नया था, और यह मेरे लिए एक लंबे समय ले लिया है कि यह पता लगाने की है, तो मैंने सोचा कि मैं हिस्सा था।

0

data.table दृष्टिकोण का उपयोग कर एक सरल समाधान।

library(data.table) 

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

मामले में आप एक अच्छे तालिका स्वरूप में उत्पादन नयी आकृति प्रदान करना चाहते हैं:

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

अब हम इस आसान बनाने के लिए मिलान फ़ंक्शन का उपयोग कर सकते हैं।

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() समारोह एक सरल उपाय की तरह दिखता है:

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 
संबंधित मुद्दे