Другие два варианта:
Базовый пакет:
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')
Элементы класса и структуры требуются стандартом для хранения в памяти в том же порядке, в котором они объявлены. Таким образом, в вашем примере было бы невозможно, чтобы d
отображался до b
.
Кроме того, большинство архитектур предпочитают, чтобы многобайтовые типы выровнялись на границах 4 или 8 байтов. Таким образом, все, что может сделать компилятор, это оставить пустые байты заполнения между членами класса.
Вы можете минимизировать заполнение путем изменения порядка членов, увеличивая или уменьшая порядок размеров. Или у вашего компилятора может быть опция #pragma pack
или что-то подобное, что будет стремиться минимизировать заполнение при возможном расходе производительности и размера кода. Прочитайте документы для своего компилятора.
#pragma pack
равен__attribute__ ((packed))
. В C ++ 11 это стандартизируется с атрибутомalignas
. – R. Martinho Fernandes 18 July 2011 в 10:15