2016-04-12 34 views
0

Data.frame sayfamdaki belirli bir satırdaki değerlerin en az% 50'sine sahip satırları yalnızca <= döndürmesi için data.frame kümemi altsetmek istiyorum. Bir data.frame'i aynı data.frame içindeki bir satırda nasıl gruplanır?

df

Name A B C D 
r1  2 2 2 2 
r2  4 3 1 3 
r3  1 1 1 2 
r4  3 3 3 1 

ben satır r1 olduğunu tarafından subsetine çalışıyorum belirli satır

. r1 satırındaki değerlerin% 75'i <= olduğu için yalnızca r3 numaralı satırı döndürmek istiyorum.

df

Name A B C D 
r3  1 1 1 2 

Herhangi bir yardım

takdir edilecektir. Daha fazla bilgi gerekiyorsa lütfen bana bildirin.

+0

Sadece r1 temelinde karşılaştırma yapmamız gerekiyor mu? –

+0

@KunalPuri Sorunuz için teşekkür ederiz. Evet, şimdilik bu sadece benim "r1" temelinde bir karşılaştırma yapmak niyetim. – Dre

+0

Ayrıca, soru başlangıcında, sadece en az% 50'ye sahip olan satırları döndürdüğünüzde, ve sorudan aşağıya inerken, satır r1 için, sadece r3 ve r2 ve r4 değil % 50 koşulu karşılarlar. Bu şeyi açıklığa kavuşturur musun? –

cevap

0

Burada da 34 değişkenler için uygulanabilir genel bir çözümdür.

> col_names <- colnames(df)[-1] 

> index <- which(df$Name == 'r1') 
> values <- seq(1:nrow(df))[-index] 

> row_num <- integer(0) 
> for (i in values){ 
+ min_val <- length(col_names)/2 
+ if (length(which(df[i,col_names] <= df[index,col_names])) >= min_val) 
+ row_num <- c(row_num,i) 
+ } 

> df[row_num,] 
    Name A B C D 
3 r3 1 1 1 2 

Veri kümesi büyük olsa da, biraz zaman alabilir. Performansı data.table paketi ile geliştirebilirsiniz.

+0

Cevabınız ve sabrınız için teşekkür ederiz. Merak ediyorum ki, her sütun için bir “if” ifadesi yapmadan yaklaşımınız mümkün mü? Benim gerçek data.frame içinde 34 değişken var, bu yüzden her biri için 'if' yapmak ideal değil ama işe yarıyor. – Dre

2

koşullar sayısını ekleyin 3'e kullanarak "+" ve karşılaştırmak satır bazında bir satırda buluştu:

subset(df, ((A <= A[1]) + (B <= B[1]) + (C <= C[1]) + (D <= D[1])) >= 3) 

> subset(df, ((A <= A[1]) + (B <= B[1]) + (C <= C[1]) + (D <= D[1])) >= 3) 
    Name A B C D 
1 r1 2 2 2 2 
3 r3 1 1 1 2 

sonra sadece eklemek de 'r1' kaldırmak istiyorsanız [-1, ]

Bu, bir yüzde kriterine karşı test edilebilen sayısal bir vektör sağlamak için genelleştirilebilir; Her satırdaki ilk satırdaki muadillerinden daha az olan öğe sayısını verir. Aşağıda

rowSums(sweep(df[-1], 2, unlist(df[1,-1]), "<=")) 
[1] 4 2 4 2 

bir tanıtımdır: tek bir satır dataframe başarısız olarak ben üçüncü argümanı kullanarak çünkü ilk satırı unlist için gerekli

Bir apply çözüm muhtemelen görünüyordu olurdu aklıma geldi
df2 <- cbind(nms = paste0("r", 1:10), 
      as.data.frame(matrix(sample(1:10, 200,repl=TRUE), 10))) 
df2 
#-------------- 
nms V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 
1 r1 8 6 10 7 3 7 2 8 4 9 9 4 5 4 8 7 2 1 6 4 
2 r2 3 9 6 3 9 10 6 10 10 3 3 2 4 4 4 10 3 5 2 1 
3 r3 1 7 6 8 3 5 2 3 1 5 5 4 8 3 1 6 2 10 3 7 
4 r4 2 6 10 10 8 7 9 1 4 5 6 7 2 6 8 3 5 10 10 3 
5 r5 5 5 7 2 5 10 2 9 2 9 4 6 1 5 8 5 8 6 3 5 
6 r6 4 1 7 7 6 9 6 3 4 3 2 9 4 8 10 3 4 4 10 4 
7 r7 7 1 10 4 1 2 8 5 8 8 5 5 5 6 4 10 6 9 10 6 
8 r8 10 8 1 4 1 4 10 3 1 3 10 3 4 9 4 7 4 9 2 2 
9 r9 3 10 9 1 10 8 8 4 7 2 7 2 9 10 3 3 7 4 10 1 
10 r10 4 7 3 3 1 9 4 1 9 5 3 9 9 3 9 2 9 10 2 4 
#----------------- 
rowSums(sweep(df2[-1], 2, unlist(df2[1,-1]), "<=")) 
# [1] 20 11 15 12 12 11 11 13 10 11 
rowSums(sweep(df2[-1], 2, unlist(df2[1,-1]), "<=")) >= 20*0.75 
# [1] TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

df2[ rowSums(sweep(df2[-1], 2, unlist(df2[1,-1]), "<=")) >= 20*0.75 , ] 
#--------- 
    nms V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 
1 r1 8 6 10 7 3 7 2 8 4 9 9 4 5 4 8 7 2 1 6 4 
3 r3 1 7 6 8 3 5 2 3 1 5 5 4 8 3 1 6 2 10 3 7 

colSums(apply(df2[-1], 1, "<=", df2[1,-1])) >= ncol(df2)*.7 

Not `bir matris döner uygulamak biçimi nedeniyle colSums kullanmaya gerek: bazı R programcılar için daha açık Sütun odaklı moda, bazen başlayanlar için bir bulmaca.

Varsayım: veri kümesi olarak, Name saklayan birinci sütun dışındaki her bir sütun karşılaştırarak

+0

Benzer mantık iki eşit büyüklükteki "df" - '(rowSums (df [-1] <= df [rep (1, nrow (df)), - 1])> = (0.75 * ncol) öğelerinin bir karşılaştırmasını kullanarak (df ​​[-1]))) ' – thelatemail

+0

@thelatemail Yaklaşımınız için teşekkür ederiz. – Dre

+0

@ 42- Cevabınız için teşekkür ederiz. Her bir sütunu tek tek eklemek zorunda kalmadan 'subset' yaklaşımını yapmak mümkün mü? Benim gerçek data.frame içinde 34 tane değişken olduğundan, her bir sütunu eklemek istemiyorum. – Dre

İlgili konular