2011-05-24 19 views
10

में समूहबद्ध चर के आधार पर लगातार सूचकांक कैसे बनाएं, मेरे पास डेटा फ्रेम (all_data) है जिसमें मेरे पास साइट्स (1 ... से n) और उनके स्कोर उदा।डेटाफ्रेम

site score 
    1 10 
    1 11 
    1 12 
    4 10 
    4 11 
    4 11 
    8 9 
    8 8 
    8 7 

मुझे क्या करना चाहते हैं डेटा फ्रेम में एक और स्तंभ बनाने है कि संख्या संख्यात्मक क्रम में प्रत्येक साइट उदा 1 3. करने के लिए से ऊपर के उदाहरण में तो all_data लगेगा जैसे:

site score number 
    1 10 1 
    1 11 1 
    1 12 1 
    4 10 2 
    4 11 2 
    4 11 2 
    8 9  3 
    8 8  3 
    8 7  3 

मुझे यकीन है कि यह आसानी से हल किया जाना चाहिए, लेकिन मैं अभी तक एक तरह से नहीं मिली है।

+1

इस पहलू आर में निर्माण है, मेरा मानना ​​है। –

उत्तर

12

एक sidenote पर Data$number <- as.numeric(as.factor(Data$site))

का प्रयास करें: एक हाथ पर मेरे और @Chase का समाधान है, और दूसरी तरफ @DWin में से एक के बीच का अंतर, संख्या के आदेश है। दोनों as.factor और factor स्वचालित रूप से, स्तरों को सॉर्ट जाएगा, जबकि कि @DWin के समाधान में ऐसा नहीं होता है:

Dat <- data.frame(site = rep(c(1,8,4), each = 3), score = runif(9)) 

Dat$number <- as.numeric(factor(Dat$site)) 
Dat$sitenum <- match(Dat$site, unique(Dat$site)) 

देता

> Dat 
    site  score number sitenum 
1 1 0.7377561  1  1 
2 1 0.3131139  1  1 
3 1 0.7862290  1  1 
4 8 0.4480387  3  2 
5 8 0. 3  2 
6 8 0.8778102  3  2 
7 4 0.6916340  2  3 
8 4 0.3033787  2  3 
9 4 0.6552808  2  3 
+0

जब आप as.factor() का उपयोग करते हैं तो स्तर स्वचालित रूप से क्रमबद्ध होते हैं? –

+0

@ ब्रैंडन: दरअसल, जब आप 'कारक' का उपयोग करते हैं। समाधान जो सॉर्टिंग नहीं करता है, डीडब्ल्यूएन में से एक है। प्रश्न में एक उदाहरण जोड़ा गया। –

3

आप एक कारक में साइट बारी और फिर सांख्यिक लौट सकते हैं कि कारक की या पूर्णांक मूल्यों:

dat <- data.frame(site = rep(c(1,4,8), each = 3), score = runif(9)) 
dat$number <- as.integer(factor(dat$site)) 
dat 

    site  score number 
1 1 0.5305773  1 
2 1 0.9367732  1 
3 1 0.1831554  1 
4 4 0.4068128  2 
5 4 0.3438962  2 
6 4 0.8123883  2 
7 8 0.9122846  3 
8 8 0.2949260  3 
9 8 0.6771526  3 
8

यह काफी कुशल होना चाहिए और समझा जा सकता:

Dat$sitenum <- match(Dat$site, unique(Dat$site)) 
8

दो अन्य विकल्प:

1)data.table पैकेज से .GRP समारोह का उपयोग करना:

> dat 
    site  score num 
1: 1 0.14945795 1 
2: 1 0.60035697 1 
3: 1 0.94643075 1 
4: 8 0.68835336 2 
5: 8 0.50553372 2 
6: 8 0.37293624 2 
7: 4 0.33580504 3 
8: 4 0.04825135 3 
9: 4 0.61894754 3 
10: 8 0.96144729 2 
11: 8 0.65496051 2 
12: 8 0.51029199 2 
:

library(data.table) 
setDT(dat)[, num := .GRP, by = site] 

इस के नीचे से उदाहरण डाटासेट साथ में जो परिणाम

2)dplyr से group_indices समारोह का उपयोग करना:

dat$num <- group_indices(dat, site) 

या जब आप गैर मानक मूल्यांकन के आसपास काम करना चाहता हूँ:

library(dplyr) 
dat %>% 
    mutate(num = group_indices_(dat, .dots = c('site'))) 

जिसमें परिणाम:

site  score num 
1  1 0.42480366 1 
2  1 0.98736177 1 
3  1 0.35766187 1 
4  8 0.06243182 3 
5  8 0.55617002 3 
6  8 0.20304632 3 
7  4 0.90855921 2 
8  4 0.25215078 2 
9  4 0.44981251 2 
10 8 0.60288270 3 
11 8 0.46946587 3 
12 8 0.44941782 3 

के रूप में देखा जा सकता है, dplyr समूह संख्याओं का एक अलग क्रम देता है।आधार आर के साथ

1):


यदि आप किसी अन्य संख्या हर बार समूह में परिवर्तन चाहते हैं, वहाँ कई अन्य विकल्प हैं

# option 1: 
dat$num <- cumsum(c(TRUE, head(dat$site, -1) != tail(dat$site, -1))) 

# option 2: 
x <- rle(dat$site)$lengths 
dat$num <- rep(seq_along(x), times=x) 

2)data.table साथ पैकेज:

library(data.table) 
setDT(dat)[, num := rleid(site)] 

जो सभी में परिणाम:

> dat 
    site  score num 
1  1 0.80817855 1 
2  1 0.07881334 1 
3  1 0.60092828 1 
4  8 0.71477988 2 
5  8 0.51384565 2 
6  8 0.72011650 2 
7  4 0.74994627 3 
8  4 0.09564052 3 
9  4 0.39782587 3 
10 8 0.29446540 4 
11 8 0.61725367 4 
12 8 0.97427413 4 

प्रयुक्त डेटा:

dat <- data.frame(site = rep(c(1,8,4,8), each = 3), score = runif(12)) 
संबंधित मुद्दे