7
$\begingroup$

my current code is:

binsize = 21;
data = {535, 481, 554, 567, 565, 513, 526, 506, 565, 475, 552, 533, 
   474, 556, 520, 508, 597, 479, 537, 499, 546, 473, 579, 526, 594, 
   477, 518, 538, 497, 565};
firstbin = 472;
a = BinCounts[data, {firstbin, Max[data] + binsize, binsize}];
b = Range[firstbin, Max[data] + binsize, binsize];
Transpose[{Take[b, Length[a]], a}] // TableForm

Which does give me a nice table, however I would like the bins to be labeled something like "472-492 6" instead of just "472 6"

any advice would be great, thank you.

$\endgroup$

2 Answers 2

9
$\begingroup$

You can use HistogramList to get bin limits and bin counts in one step and process the output to get the desired structure:

{binlims, bincounts} = HistogramList[data, {firstbin, Max[data] + binsize, binsize}];
bins = Row[{#, #2 - 1}, "-"] & @@@ Partition[binlims, 2, 1];
TableForm[Transpose[{bins, bincounts}]]

enter image description here

Alternatively, you can use MovingMap, Developer`PartitionMap or the (undocumented) 6-argument form of Partition to get the first column:

bins2 = MovingMap[Row[{First@#, Last@# - 1}, "-"] &, binlims, 1]
bins3 = Developer`PartitionMap[Row[{First@#, Last@# - 1}, "-"] &, binlims, 2, 1];
bins4 = Partition[binlims, 2, 1, {1, -1}, {}, Row[{#, #2 - 1}, "-"] &];
bins == bins2 == bins3 == bins4

True

Finally, you can also use a combination of StringRiffle and ToString in place of Rowas follows:

bins5 = Partition[binlims, 2, 1, {1, -1}, {}, StringRiffle[ToString/@{#, #2 - 1}, " - "]&]
TableForm[Transpose[{bins5, bincounts}]]

enter image description here

$\endgroup$
2
  • $\begingroup$ Thank you very much! $\endgroup$
    – Wombles
    Commented Mar 6, 2019 at 21:20
  • $\begingroup$ @Wombles, you are welcome. $\endgroup$
    – kglr
    Commented Mar 6, 2019 at 21:22
5
$\begingroup$

Here is one way:

bb = b - 1;
c = Complement[bb, {Min[bb]}];
Transpose[{Take[b, Length[a]], ConstantArray["---", Length[a]], c, a}] // TableForm

Here is the output:

enter image description here

With MarcoB's hint, and some experimenting:

c = Complement[b - 1, {Min[b - 1]}];
y = Map[ToString, Take[b, Length[a]]];
z = Map[ToString, c]; 
Transpose@{Map[StringJoin, Transpose[{y, ConstantArray["---", Length[a]], z}]], a} // TableForm

enter image description here

$\endgroup$
4
  • $\begingroup$ I wish I knew more about string manipulation to get the first three columns to combine to one column of text! $\endgroup$
    – mjw
    Commented Mar 6, 2019 at 21:15
  • 1
    $\begingroup$ You might want ToString and StringJoin $\endgroup$
    – MarcoB
    Commented Mar 6, 2019 at 21:53
  • $\begingroup$ @MarcoB, Yes, Thank you! That's what I was looking for! I actually found ToString and figured there was a way of joining the columns ... Probably there is a more efficient way then what I've put together. At least it is a start. $\endgroup$
    – mjw
    Commented Mar 7, 2019 at 1:54
  • $\begingroup$ Row as suggested in kglr's answer, can also work as a substitute for StringJoin. $\endgroup$
    – mjw
    Commented Mar 7, 2019 at 2:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.