RosettaCodeData/Task/Bin-given-limits/R/bin-given-limits.r

44 lines
2.7 KiB
R

limits1 <- c(23, 37, 43, 53, 67, 83)
data1 <- c(95,21,94,12,99,4,70,75,83,93,52,80,57,5,53,86,65,17,92,83,71,61,54,58,47,
16,8,9,32,84,7,87,46,19,30,37,96,6,98,40,79,97,45,64,60,29,49,36,43,55)
limits2 <- c(14, 18, 249, 312, 389, 392, 513, 591, 634, 720)
data2 <- c(445,814,519,697,700,130,255,889,481,122,932,77,323,525,570,219,367,523,442,933,
416,589,930,373,202,253,775,47,731,685,293,126,133,450,545,100,741,583,763,306,
655,267,248,477,549,238,62,678,98,534,622,907,406,714,184,391,913,42,560,247,
346,860,56,138,546,38,985,948,58,213,799,319,390,634,458,945,733,507,916,123,
345,110,720,917,313,845,426,9,457,628,410,723,354,895,881,953,677,137,397,97,
854,740,83,216,421,94,517,479,292,963,376,981,480,39,257,272,157,5,316,395,
787,942,456,242,759,898,576,67,298,425,894,435,831,241,989,614,987,770,384,692,
698,765,331,487,251,600,879,342,982,527,736,795,585,40,54,901,408,359,577,237,
605,847,353,968,832,205,838,427,876,959,686,646,835,127,621,892,443,198,988,791,
466,23,707,467,33,670,921,180,991,396,160,436,717,918,8,374,101,684,727,749)
createBin <- function(limits, data) sapply(0:length(limits), function(x) sum(findInterval(data, limits) == x))
#Contains some unicode magic so that we can get the infinity symbol and <= to print nicely.
#Half of the battle here is making sure that we're not being thrown by R being 1-indexed.
#The other half is avoiding the mathematical sin of saying that anything can be >=infinity.
printBin <- function(limits, bin)
{
invisible(sapply(0:length(limits), function(x) cat("Bin", x, "covers the range:",
if(x == 0) "-\U221E < x <" else paste(limits[x], "\U2264 x <"),
if(x == length(limits)) "\U221E" else limits[x + 1],
"and contains", bin[x + 1], "elements.\n")))
}
#Showing off a one-line solution. Admittedly, calling the massive anonymous function "one-line" is generous.
oneLine <- function(limits, data)
{
invisible(sapply(0:length(limits), function(x) cat("Bin", x, "covers the range:",
if(x == 0) "-\U221E < x <" else paste(limits[x], "\U2264 x <"),
if(x == length(limits)) "\U221E" else limits[x + 1],
"and contains", sum(findInterval(data, limits) == x),
"elements.\n")))
}
createBin(limits1, data1)
printBin(limits1, createBin(limits1, data1))
createBin(limits2, data2)
printBin(limits2, createBin(limits2, data2))
oneLine(limits2, c(data1, data2))#Not needed.