2015-05-28 14 views
0

У меня есть таблица в 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 тыс. Человек, и между возрастом 15-25 лет, 25-35 лет и т. Д., Поэтому я получаю гораздо меньше столбцов.

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

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

Любые идеи?

+0

Я думаю, вы можете преобразовать широкий формат длинного формата (возможно, 'as.data.frame', если это объект таблицы или« расплавить », если он является матрицей) и использовать' cut' для создания столбца группировки на основе столбца в длинном формате, получить подсчет на основе этого и переформатируйте его обратно в широкий формат с помощью 'dcast' из' reshape2'. BTW, у вас есть объект 'table' или' matrix' – akrun

+0

У меня есть объект 'table', поскольку вывод' str (tbl) 'is:" 'table' int [1: 7, 1:42] "и т. Д. –

+0

В любом случае, у вас есть решение, размещенное ниже, которое, как я думаю, должно работать. Если не преобразовать его в 'mat <- as.matrix (tbl)', а затем попробуйте. – akrun

ответ

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])) 

Edit: Если вы хотите же COLNAMES как в коврике, но считается в зависимости от категории, в дополнение сделать:

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. 
+0

Спасибо @Nightwriter. Однако, разве это не предполагает, что мои имена столбцов упорядочены из 15: (85-1)? В моем случае столбцы выполняются случайным образом в соответствии с тем, что было в исходной таблице, например. 15, 17, 18, 19, 22, 26 и т. Д. - Мне нужно сохранить одинаковые имена столбцов (соответствующие возрасту), как в исходной таблице. –

+0

Вторая строка просто ассоциирует числа с cols. Это могли быть любые целые числа в случайном порядке, соответствующие вашей проблеме. Вы должны убедиться, что третья строка отражает ваши требуемые интервалы. Посмотрите на '? Cut()'. Здесь интервалы начинаются с 15, заканчиваются на 105 и 10 длинны. Аргумент 'right = FALSE' гарантирует, что 25 принадлежит интервалу' [25,35] ', а не' [15,25] '. Четвертая строка суммирует кол для каждого интервала pr. линии, точки зрения их положения в матрице. – Nightwriter

+0

Сделано редактирование для вывода сохраненных имен столбцов, но с значениями суммы категории вместо входных значений. – Nightwriter