Intradataframe Analysis - создание производного кадра данных из другого кадра данных
Это может быть немного тупым вопросом заголовка, так как я все еще встаю, чтобы ускориться с R, но я делаю манипуляции с фреймами данных, чтобы извлечь определенные проценты относительно групп классификации, которые захватываются одним столбцом, что является фактором против другого столбца я хочу получить проценты. Я буду использовать встроенные mtcars, чтобы продемонстрировать, чего я пытаюсь достичь, когда механизм играет роль переменной классификации, а цил - это данные, с которых я пытаюсь получить проценты.
Просто некоторые детали фона, чтобы сгладить вопрос:
Столбец gear
охватывает 3 различных значения, 3,4,5
.
Столбец cyl
охватывает также 3 различных значения, 4,6,8
Первый элемент моего списка говорит, какой процент типов передач имеет не более 4 цилиндров. Для моделей с 3 передачами есть только один, Toyota Corona, из 15 моделей с тремя передачами, и, следовательно, процент должен составлять 1/15 = 0,06767. Для моделей с четырьмя шестернями восемь из 12 моделей с четырьмя передачами дают 8/12 = 0.667.
Теперь вот метод, который я написал, чтобы сделать это вычисление. Однако структура выпуска - это не то, что я желаю. Вместо этого я хотел бы объединить все это в кадр данных, причем первый столбец представляет собой различные значения цил, а остальные столбцы - 3, 4 и 5 для типов передач, где строки представляют собой различные проценты. Я очень близок, но мне нужна помощь в изменении формы списка, который я в настоящее время достигал, или, возможно, даже при использовании альтернативной функции приложения, которая обеспечит таблицу процентов, которые я преследую, или любую другую магию, которую кто-то может приготовить.
> lapply( unique( sort( y$cyl ) ) , function(c) { tapply( y$cyl , y$gear , function(x) sum( x <= c ) / length(x) ) } )
[[1]]
3 4 5
0.06666667 0.66666667 0.40000000
[[2]]
3 4 5
0.2 1.0 0.6
[[3]]
3 4 5
1 1 1
Это то, что мы можем ожидать, что кадр данных, который я хочу отображать как
cyl X3 X4 X5
1 4 0.06666667 0.6666667 0.4
2 6 0.20000000 1.0000000 0.6
3 8 1.00000000 1.0000000 1.0
Ответы
Ответ 1
Я придумал решение после googling "преобразовать список массивов в data.frame", что сразу приведет меня к следующему SO сообщению.
p <- lapply( unique( sort( mtcars$cyl ) ) , function(c) { tapply( mtcars$cyl , mtcars$gear , function(x) sum( x <= c ) / length(x) ) } )
> df <- data.frame( matrix( unlist(p) , nrow = length(p) , byrow=T ) )
> df
X1 X2 X3
1 0.06666667 0.6666667 0.4
2 0.20000000 1.0000000 0.6
3 1.00000000 1.0000000 1.0
Решение работает, кроме того, что имена классификации называются заголовками столбцов, но похоже, что с последующим назначением это можно также восстановить...
> colnames(df) <- names(p[[1]])
> rownames(df) <- unique( sort( mtcars$cyl ) )
> df
3 4 5
4 0.06666667 0.6666667 0.4
6 0.20000000 1.0000000 0.6
8 1.00000000 1.0000000 1.0
На самом деле, другие ответы на связанный вопрос хорошо отражают проблему заголовков столбцов, проблема заголовка строки остается, так как эти значения теряются в моих анонимных вызовах функций.