2016-04-06 26 views
2

değerlerin matrisi oluşturmak: istediğimR: I başka veriden üretilen <code>x</code> ve frekansının yapılmış aşağıdaki veri çerçevesi, <code>table5</code>, <code>counts</code> kullanılarak diğer tablo

x freq 
1 1 3 
2 3 21 
3 4 21 
4 5 1345 
5 7 1 

transfer - orijinal veri çerçevesi içinde diğer değerleri ile kullanım için, yani genel bir şekilde, içinde - aşağıdaki veri çerçevesi table5if içine:

 Frequency 
3    21 
4    21 
5    1345 
other   4 

örneğin 3, 4 ve 5, doğrudan aktarılır sayı sıklığı ve ark l Diğer sayılar other'da toplanır. Benim son girişim şudur: Bütün uyarı veya hata (örneğin, "öğe sayısına yerine ..." ve boyutlarının "sayısının çeşit vermiştir var

k <- seq(1, nrow(table5), by=1) 
    ifelse(table5$x[k] == 3, table5if[1] <- table5$freq[k], 
      ifelse(table5$x[k] == 4, table5if[2] <- table5$freq[k], 
       ifelse(table5$x[k] == 5, table5if[3] <- table5$freq[k], table5if[4] <- (table5if[4] + table5$freq[k]) 
       ) 
      ) 
    ) 

Bu girişim ve if(...){...} else {...} etc. kullanan diğer girişimler, .. "ve hiçbir ikna edici sonuç elde etmedim. Her iki hata/uyarı için sayısız başka soruyu inceledim ve aradığım şeyi tam olarak bulamıyorum - vektörler hakkında çok şey var ama tam olarak Neden bu sorun için uygun bir seçenek önerebilir misiniz?

+0

Neden tüm frekansları ekledikten sonra diğerlerinin toplamını hesaplamak için 3, 4 ve 5 rakamları için neden çıkarsın? –

+0

Bu kesinlikle en basit seçenek olacak! Ayrıca hazır fonksiyonlardan kaçınmak ve onu matematik ve mantığa bağlı tutmaktan da hayran oluyorum. Öneriniz için çok teşekkürler, windrunn3r.1990! – Psydes

cevap

3

Mevcut olmayan tüm seviyeler NA olurken factor(x, levels = 3:5) tarafından toplanır. n İsterseniz bunu "other" olarak değiştirin. o %in% ile 'x' sütunun değerlerine dayalı mantıklı bir dizin oluşturmak olacaktır onlara

library(data.table) 
setDT(df)[, .(Frequency = sum(freq)), by = factor(x, levels = 3:5)] 
# factor Frequency 
# 1:  NA   4 
# 2:  3  21 
# 3:  4  21 
# 4:  5  1345 
+0

Bu da harika bir şekilde çalıştı! Çok teşekkürler David Arenburg. – Psydes

0

A base R seçeneği kullanmamak yerine NA s ayrı grup tutar olarak data.table bu durumda uygundur. 'I1' ve rbind'un 'table5' alt kümeleri ile negatif indeksine dayanarak 'freq' değerini sum alırız.

i1 <- table5$x %in% 3:5 
`row.names<-`(rbind(table5[i1,], list(x= "Other", 
      freq=sum(table5[!i1,"freq"]))), NULL) 
#  x freq 
#1  3 21 
#2  4 21 
#3  5 1345 
#4 Other 4 
+0

Bu, mutlak bir muamele yaptı! Tablo5'ten manipüle edilmiş değerler ile test ettim ve problem yaşamadım. Senin için +10 sokak kredisi, akrun! Çok teşekkür ederim. – Psydes

+0

@Psydes Geri bildiriminiz için teşekkür ederiz. Cevap vermeyi unuttun mu? – akrun