Объединение столбцов таблицы по возрастному диапазону

У меня есть таблица в R, которая выглядит так (ниже приведен пример):

|       | 15 | 17 | 18 | 22 | 25 | 26 | 27 | 29 | 
|-------|----|----|----|----|----|----|----|----|
| 10000 | 1  | 2  | 1  | 2  | 4  | 3  | 5  | 2  |
| 20000 | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  |
| 30000 | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  |
| 40000 | 0  | 0  | 0  | 1  | 2  | 3  | 6  | 3  |
| 50000 | 0  | 0  | 0  | 0  | 0  | 0  | 1  | 1  |
| 60000 | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  |

В строках указаны уровни дохода, а в столбцах — возрастные уровни. По сути, я создаю эту таблицу, чтобы увидеть, связан ли возраст с доходом с помощью теста хи-квадрат. Цифры в таблице - это количество вхождений, например. В моем наборе данных есть 2 человека в возрасте 17 лет с доходом 10000.

И возраст, и уровень дохода типа «num» в R непрерывны.

Я хочу, по сути, объединить столбцы по возрасту, чтобы получить таблицу со всеми, кто имеет доход 10 000 и находится в возрасте от 15 до 25 лет, от 25 до 35 лет и т. д., поэтому я получаю гораздо меньше столбцов.

Также обратите внимание, что colnames(tbl) = "15", "17", "18", не "Возраст" — я не определил общее имя для своих столбцов и строк.

Я отмечаю этот ответ делает что-то подобное, но не уверен, как его применить, учитывая, что у меня нет имени для моих столбцов, например. "миль на галлон" (в случае ссылки).

Любые идеи?


person Dhruv Ghulati    schedule 28.05.2015    source источник
comment
Я думаю, вы можете преобразовать широкий формат в длинный формат (возможно, с помощью as.data.frame, если это объект таблицы или melt, если это матрица) и использовать cut для создания столбца группировки на основе столбца в длинном формате, получить счет на основе это, и верните его в широкий формат с помощью dcast из reshape2. Кстати, у вас есть table объект или matrix   -  person akrun    schedule 28.05.2015
comment
У меня есть объект table, так как вывод str(tbl): «таблица» int [1: 7, 1: 42] и т. д.   -  person Dhruv Ghulati    schedule 29.05.2015
comment
В любом случае, у вас есть решение, опубликованное ниже, которое, я думаю, должно работать. Если нет, конвертируйте его в mat <- as.matrix(tbl), а затем попробуйте.   -  person akrun    schedule 29.05.2015


Ответы (1)


Сделал здесь свою собственную матрицу, но она должна подойти и для df.

mat <- matrix(sample(1:10,8500,replace = TRUE),ncol=85)
colnames(mat) <- 15:99
levs <- cut(as.numeric(colnames(mat)),seq(15,105,10),right = FALSE)
res <- sapply(as.character(unique(levs)),function(x)rowSums(mat[,levs==x]))

Изменить: если вам нужны те же имена столбцов, что и в мате, но подсчеты в соответствии с категорией, дополнительно выполните:

res <- res[,levs] # expands the res df to one category count col pr. original col in mat.
colnames(res) <- colnames(mat) # renames cols to reflect input matrix mat.
person Nightwriter    schedule 28.05.2015
comment
Спасибо @Nightwriter. Однако не предполагает ли это, что имена моих столбцов упорядочены от 15: (85-1)? В моем случае столбцы меняются случайным образом в соответствии с тем, что было в исходной таблице, например. 15, 17, 18, 19, 22, 26 и т. д. - мне нужно сохранить те же имена столбцов (соответствующие возрасту), что и в исходной таблице. - person Dhruv Ghulati; 29.05.2015
comment
Вторая строка просто связывает числа с столбцами. Это могли быть любые целые числа в случайном порядке, подходящие для вашей задачи. Вы должны убедиться, что третья строка отражает желаемые интервалы. Посмотрите на ?cut(). Здесь интервалы начинаются с 15, заканчиваются на 105 и имеют длину 10. Аргумент right=FALSE гарантирует, что 25 принадлежит интервалу [25,35), а не [15,25). Четвертая строка суммирует столбцы для каждого интервала pr. линии, независимо от их положения в матрице. - person Nightwriter; 31.05.2015
comment
Внесены изменения для вывода сохраненных имен столбцов, но со значениями суммы категорий вместо входных значений. - person Nightwriter; 31.05.2015