【问题标题】:How to get the proportions of data with respect to two variables in R?如何获得R中两个变量的数据比例?
【发布时间】:2013-12-01 04:09:12
【问题描述】:

我有 4 列:车辆 ID、车辆类别、车辆长度和车辆宽度。每辆车都有一个唯一的车辆 ID(例如 2、4、5...),并且每 0.1 秒收集一次数据,这意味着车辆 ID 在车辆 ID 列中重复出现的次数。车辆类别列中存在三个车辆类别,即 1 = 摩托车、2 = 汽车、3 = 卡车,并且长度和宽度在各自的列中针对每个车辆 ID。我想按车辆类别对数据进行子集化,然后找到每个类别中每个车辆模型(唯一长度和宽度)的比例。例如,对于 Vehicle Class = 2 即汽车,我想找到不同型号的汽车(唯一的长度和宽度)以及它们相对于汽车总数的比例。这是我到目前为止所做的:

按车辆类别对数据进行子集

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”。请帮助我找出所有类型车辆中每种型号的比例。

编辑(示例输入)

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

【问题讨论】:

    标签: r


    【解决方案1】:

    您应该给出示例输出和示例输入,以便更容易回答。据我了解,您想要类似的东西-

    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
    

    如果没有,请添加示例输出和示例输入。

    【讨论】:

    • 我已经添加了示例输入输出
    • 此解决方案有效。它返回的不是三个表,而是一个表,其中Vehicleclass 作为列之一。如果您愿意,您可以在dt2 上进行子集化,如您在问题中所示,以获得三个单独的数据集,尽管我不明白为什么它不能只是一个数据集。
    • 感谢您的解决方案,它有效。唯一的问题是它没有给出正确的“ClassLengthWidthFreq”。它报告的频率远高于预期,例如它报告的第一个值是 18677(应用于原始数据时)。这可能是因为它在计算同一辆车的重复次数时也应该只计算一次。
    • 我刚刚发布了我的输出,它与您的示例输出相匹配(除了您的卡车频率在您的示例输出中计算不正确)。我不明白你在评论中提到的问题。
    • 我提到的是,在我使用您的代码时的原始数据中,输出频率为 18677,这意味着 18677 辆汽车的长度 = 13.5 和宽度 = 4.5。这是不正确的,因为我知道汽车的总数是 2830。我认为输出如此之大的原因是,对于给定的模型,它没有正确地将同一车辆随时间的重复计算为 1,而是将同一模型再次计算为数字在表中找到它的次数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多