2013-12-01 5 views
0

У меня есть 4 колонки: Идентификатор автомобиля, Класс автомобиля, Длина транспортного средства и Ширина транспортного средства. Каждое транспортное средство имеет уникальный идентификатор транспортного средства (например, 2, 4, 5, ...), и данные собирались каждые 0,1 секунды, что означает, что идентификаторы транспортных средств повторяются в колонке Идентификатор транспортного средства за количество раз, которое они наблюдали. Существует три класса транспортных средств, то есть 1 = мотоциклы, 2 = автомобили, 3 = грузовые автомобили в колонке класса транспортного средства, а длины и ширина указаны в соответствующих колонках по каждому идентификатору транспортного средства. Я хочу подмножить данные по классу автомобиля, а затем найти пропорции каждой модели автомобиля (уникальная длина и ширина) в каждом классе. Например, для автомобиля класса = 2, т. Е. Автомобиля, я хочу найти разные модели автомобилей (уникальная длина и ширина) и их пропорции относительно общего количества автомобилей. Вот то, что я сделал до сих пор:Как получить пропорции данных по двум переменным в R?

Для подмножества данных с помощью класса Vehicle

cars <- subset(b, b$'Vehicle class'==2) 
trucks <- subset(b, b$'Vehicle class'==3) 
motorcycles <- subset(b, b$'Vehicle class'==1) 

Чтобы найти количество машин

numofcars <- length(unique(cars$'Vehicle ID')) # 2830 
numoftrucks <- length(unique(trucks$'Vehicle ID')) # 137 
numofmotorcycles <- length(unique(motorcycles$'Vehicle ID'))# 45 

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

by (cars, INDICES=cars$'Vehicle Length', FUN=table(cars$'Vehicle width')) 

R дает сообщение, согласно которому он не может найти «FUN». Пожалуйста, помогите мне найти пропорции каждой модели во всех классах транспортных средств.

EDIT (Пример ввода)

Vehicle ID Vehicle Class Vehicle Length Vehicle Width 
2 2 13.5 4.5 
2 2 13.5 4.5 
2 2 13.5 4.5 
2 2 13.5 4.5 
3 2 13.5 4.0 
3 2 13.5 4.0 
3 2 13.5 4.0 
3 2 13.5 4.0 
4 2 10.0 4.5 
4 2 10.0 4.5 
4 2 10.0 4.5 
4 2 10.0 4.5 
5 3 23.0 4.5 
5 3 23.0 4.5 
5 3 23.0 4.5 
5 3 23.0 4.5 
6 3 76.5 4.5 
6 3 76.5 4.5 
6 3 76.5 4.5 
6 3 76.5 4.5 
6 3 76.5 4.5 
7 1 10.0 3.0 
7 1 10.0 3.0 
7 1 10.0 3.0 
7 1 10.0 3.0 
8 2 13.5 5.5 
8 2 13.5 5.5 
8 2 13.5 5.5 
8 2 13.5 5.5 

Обратите внимание, что в этом входе: Общее количество автомобилей = 4, грузовики = 2, мотоциклы = 1

Пример вывода

Group: cars 
VehicleLength VehicleWidth Proportion 
13.5 4.5 0.25 
13.5 4.0 0.25 
13.5 5.5 0.25 
23.0 4.5 0.25 

Group:trucks 
VehicleLength VehicleWidth Proportion 
23.0 4.5 0.5 
76.0 4.5 0.5 

Group: motorcycles 
VehicleLength VehicleWidth Proportion 
10.0 3.0 1.0 

ответ

0

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

library(data.table) 
dt <- data.table(df) 

dt2 <- dt[, 
      list(ClassLengthWidthFreq = .N), 
      by = c('VehicleClass','VehicleLength','VehicleWidth') 
      ] 
dt2[, 
    ClassLengthWidthFreqProportion := ClassLengthWidthFreq/sum(ClassLengthWidthFreq), 
    by = 'VehicleClass' 
    ] 

Выходной -

> dt2 
    VehicleClass VehicleLength VehicleWidth ClassLengthWidthFreq ClassLengthWidthFreqProportion 
1:   2   13.5   4.5     4      0.2500000 
2:   2   13.5   4.0     4      0.2500000 
3:   2   10.0   4.5     4      0.2500000 
4:   3   23.0   4.5     4      0.4444444 
5:   3   76.5   4.5     5      0.5555556 
6:   1   10.0   3.0     4      1.0000000 
7:   2   13.5   5.5     4      0.2500000 

Если нет, то пожалуйста, добавьте пример вывода и ввода пробы.

+0

Я добавил образец ввода и вывода –

+0

Это решение работает тогда. Вместо трех таблиц он возвращает одну таблицу с «Vehicleclass» в качестве одного из столбцов. Вы можете подмножество на 'dt2', как вы показали в своем вопросе, чтобы получить три отдельных набора данных, если хотите, хотя я не понимаю, почему это не может быть только одним набором данных. – TheComeOnMan

+0

Спасибо за ваше решение, оно работает. Единственная проблема заключается в том, что он не дает правильного «ClassLengthWidthFreq». Он сообщает, что частота намного выше, чем ожидалось, например. первое значение, которое он представляет, составляет 18677 (при применении к исходным данным). Возможно, это связано с тем, что он подсчитывает повторения одного и того же транспортного средства и когда он должен считать его только один раз. –

Смежные вопросы