2016-06-09 43 views
6

Bu, here numaralı soruyu sorduğum soruyla ilgili bir sorudur. Burada a) sütunlar için bunu nasıl yapılacağını (aşağıya bakınız) ve b) satırların ve sütunların seçiminin R'de oldukça farklı bir şekilde ele alındığını ve bunun da aynı yaklaşımı satırlar için kullanamayacağımı öğrendiğini öğrendim.Bir veri çerçevesini, dizinlere değil, adlara dayalı bir dizi sütun ve satır seçerek nasıl kesebilirim?

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randint(10, size=(6, 6)), 
        columns=['c' + str(i) for i in range(6)], 
        index=["r" + str(i) for i in range(6)]) 

    c0 c1 c2 c3 c4 c5 
r0 4 2 3 9 9 0 
r1 9 0 8 1 7 5 
r2 2 6 7 5 4 7 
r3 6 9 9 1 3 4 
r4 1 1 1 3 0 3 
r5 0 8 5 8 2 9 

sonra kolayca böyle adlarıyla satırlar ve sütunlar seçebilirsiniz:

print df.loc['r3':'r5', 'c1':'c4'] 

c1 c2 c3 c4 
r3 9 9 1 3 
r4 1 1 3 0 
r5 8 5 8 2 
döndürür

Yani böyle bir pandalar dataframe olduğunu varsayalım

Bunu R'de nasıl yapabilirim? Benim arzu satır/sütun dizinleri biliyorsanız, Görünüşe göre bu

df <- data.frame(c1=1:6, c2=2:7, c3=3:8, c4=4:9, c5=5:10, c6=6:11) 
rownames(df) <- c('r1', 'r2', 'r3', 'r4', 'r5', 'r6') 

    c1 c2 c3 c4 c5 c6 
r1 1 2 3 4 5 6 
r2 2 3 4 5 6 7 
r3 3 4 5 6 7 8 
r4 4 5 6 7 8 9 
r5 5 6 7 8 9 10 
r6 6 7 8 9 10 11 

gibi dataframe göz önüne alındığında, basitçe yapabilirsiniz:

df[3:5, 1:4] 

ama satırları silebilir/böylece benim analiz boyunca sütunlar Adına göre indekse göre seçmeyi tercih ederim.

c1 c2 c3 c4 
r1 1 2 3 4 
r2 2 3 4 5 
r3 3 4 5 6 
r4 4 5 6 7 
r5 5 6 7 8 
r6 6 7 8 9 

döndürür

subset(df, select=c1:c4) 

hangi ama nasıl ben de aynı anda adıyla satır aralığı seçebilir: bağlantısından ben sütunlar için aşağıdaki çalışacak öğrendik yukarıda?

Bu özel durumda, grep kullanın, ancak rasgele adlara sahip sütunlara ne dersiniz?

Ve

df[c('r3', 'r4' 'r5'), c('c1','c2', 'c3', 'c4')] 

ama gerçek bir dilim kullanmak istemiyoruz.

cevap

6

Sen rownames ile which() kullanabilirsiniz:

subset(df[which(rownames(df)=='r3'):which(rownames(df)=='r5'),], select=c1:c4) 


    c1 c2 c3 c4 
r3 3 4 5 6 
r4 4 5 6 7 
r5 5 6 7 8 
+0

Evet, should daha kesin ol (sorularımı düzenlerim): w olmalıdır keyfi isimler için ork; Burada olanlar gerçekten ayrıştırmak kolay olurdu :) – Cleb

+0

tamam ben de çok çabuk okudum. Senin ihtiyacın olan şey bu mu? – HubertL

+0

Harika! Evet, bu iyi çalışıyor.Bunu şimdilik öne sürüyorum ve diğer cevapların kalitesine bağlı olarak kabul ediyorum. – Cleb

2

Kullanım match belirli satır isimlerinin konumunu bulmak için.

df[match("r3", rownames(df)):match("r5", rownames(df)), match("c1", colnames(df)):match("c4", colnames(df))] 

    c1 c2 c3 c4 
r3 3 4 5 6 
r4 4 5 6 7 
r5 5 6 7 8 
+0

Ama sonra gerçekten kaçınmak istediğim satırları ve sütunları belirtmem gerekiyor (daha net hale getirmek için sorumu düzenledim); Sadece seçmek istediğiniz 100 satır/sütun için düşünün ... – Cleb

+0

Lütfen değişiklikleri kontrol edin. Bu senin için çalışır mı? – milan

+0

Evet, o da çalışıyor (upvoted)! Sadece 'index.c' içindeki yazım hatalarını düzeltmeniz gerekiyor. – Cleb

3

Sen tür size

'%:%' <- function(object, range) { 
    FUN <- if (!is.null(dim(object))) { 
    if (is.matrix(object)) colnames else names 
    } else identity 
    wh <- if (is.numeric(range)) range else which(FUN(object) %in% range) 
    FUN(object)[seq(wh[1], wh[2])] 
} 

df <- data.frame(c1=1:6, c2=2:7, c3=3:8, c4=4:9, c5=5:10, c6=6:11) 
rownames(df) <- c('r1', 'r2', 'r3', 'r4', 'r5', 'r6') 

senin soru için

df %:% c('c2', 'c4') 
# [1] "c2" "c3" "c4" 

rownames(df) %:% c('r2', 'r4') 
# [1] "r2" "r3" "r4" 

gibi kullanın aynı davranışı verecek bir fonksiyon yazabiliriz

df[rownames(df) %:% c('r3', 'r5'), df %:% c('c1', 'c5')] 
# c1 c2 c3 c4 c5 
# r3 3 4 5 6 7 
# r4 4 5 6 7 8 
# r5 5 6 7 8 9