2015-04-30 17 views
7

3 argüman alan bir işlev oluşturmak istiyorum: bir değer listesi ve iki kesme değeri (yüksek ve düşük). Ardından, listedeki değerlerin kaçının iki kesme değerinin aralığı içinde olmasını istiyorum.Belirli bir aralıktaki bir listeden basit fonksiyon sayma değerleri

Şimdiye kadar ben denedim: Bunlardan

count <- function(y, x1, x2){ 
    tmp1 <- length(y) 
    tmp2 <- length(y>x1) 
    tmp3 <- length(tmp2<=x2) 
    return(tmp3) 
} 

ve

count <- function(y, x1, x2){ 
    results <- list() 
    for (i in y) { 
    if(y > x1 & y <= x2) { 
     results <- results+1 
    } 
    } 
    return(results) 
} 

hiçbiri çalışmıyor. Bazıları kodumu düzeltmeme yardım edebilir mi?

cevap

7

Aşağı doğru basitleştirin. Bir vektörleşen mantıksal işlem

f <- function(x, y, z) sum(x > y & x < z) 
f(1:10, 3, 7) 
# [1] 3 

toplamını alın Ama data.table yazarlar bir adım önde olmasını. between() bir işlev yazmışlar. Ayrıca dplyr paketinde de bir tane olduğuna inanıyorum.

library(data.table) 
between 
# function (x, lower, upper, incbounds = TRUE) 
# { 
#  if (incbounds) 
#   x >= lower & x <= upper 
#  else x > lower & x < upper 
# } 
# <bytecode: 0x44fc790> 
# <environment: namespace:data.table> 

Yani aynı sonuç için sadece

sum(between(1:10, 3, 7, FALSE)) 
# [1] 3 
+1

Bu aslında utanıyorum kadar basit yapabilirsiniz yukarıdaki gibi. Yapmam gerekenden daha karmaşık bir hale getirdim. Çok teşekkür ederim! –

+0

veri tablosu gerçekten arasında bir fonksiyonun yaratıcısıdır .. – rawr

+0

@rawr - Ben bir üste görmedim, değil mi? Bu garantili görünüyor ama aynı zamanda –

İlgili konular