Другие два варианта:
Базовый пакет:
df <- unstack(dat1, form = value ~ numbers)
rownames(df) <- unique(dat1$name)
df
sqldf
package:
library(sqldf)
sqldf('SELECT name,
MAX(CASE WHEN numbers = 1 THEN value ELSE NULL END) x1,
MAX(CASE WHEN numbers = 2 THEN value ELSE NULL END) x2,
MAX(CASE WHEN numbers = 3 THEN value ELSE NULL END) x3,
MAX(CASE WHEN numbers = 4 THEN value ELSE NULL END) x4
FROM dat1
GROUP BY name')
Почему ваш метод внешнего обмена цикличен? Почему бы вам не выполнить этот код один раз? Разве это не должно быть обработано с помощью обычной рекурсии, как и другие операции на дереве? И почему в этом методе вы оба вызываете root.swapChildren (), а затем также меняете местами дочерние элементы root в этом методе?
Разве вы просто не хотите этого?:
public class BinaryTree {
...
public void swapChildren() {
root.swapChildren();
}
....
class Node {
...
public void swapChildren() {
if (right != null)
right.swapChildren();
if (left != null)
left.swapChildren();
Node toBeRight = left;
Node toBeLeft = right;
left = toBeLeft;
right = toBeRight;
}
...
}
...
}