Это может быть немного тупым вопросом заголовка, так как я все еще встаю, чтобы ускориться с 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