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

На самом деле, другие ответы на связанный вопрос хорошо отражают проблему заголовков столбцов, проблема заголовка строки остается, так как эти значения теряются в моих анонимных вызовах функций.