如何根据R中的均值和另一个向量重新排序数据帧?

时间:2017-05-10 17:50:30

标签: r sorting dataframe

我有两组数据框,第一组是:

df1 = subset(mtcars, select="gear")

head(df1)

                  gear
Mazda RX4            4
Mazda RX4 Wag        4
Datsun 710           4
Hornet 4 Drive       3
Hornet Sportabout    3

第二组的格式如下:

df2 = t(mtcars)[1:4,]

head(df2)

     Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout 
mpg         21            21       22.8           21.4              18.7    
cyl          6             6        4.0            6.0               8.0     
disp       160           160      108.0          258.0             360.0   
hp         110           110       93.0          110.0             175.0   

df1的行名称是df2的列名。

我想将geardf1的所有汽车作为一组。然后仅针对汽车计算mpgdisp的平均值,然后根据平均值从高到低对各组进行排序。

在这种情况下,预期结果将是(因为gear 3的车辆mpgdisp的平均值高于gear 4的车辆平均值:< / p>

        Hornet 4 Drive Hornet Sportabout Mazda RX4 Mazda RX4 Wag Datsun 710
mpg             21.4             18.7          21            21       22.8    
cyl              6.0              8.0           6             6        4.0                 
disp           258.0            360.0         160           160      108.0  
hp             110.0            175.0         110           110       93.0  

我希望你清楚这一点。我不知道如何根据群组的平均值将gear的群组(df1)应用于df2并命令df2。谢谢!

1 个答案:

答案 0 :(得分:1)

首先,我会再次转置df2并将df1row.names合并。

tdf2 <- t(df2)
dfmerge <- merge(df1, tdf2, by = "row.names")

然后使用dplyr计算按gear分组的平均值+显示,以及按从最高平均值到最低值的降序排列汽车。

m.mpg.disp <- dfmerge %>% group_by(gear)  %>% 
              mutate(mean.mpg.disp = mean(mpg + disp)) %>% 
              arrange(desc(mean.mpg.disp))

最后再次转置数据。

finaldf <- as.data.frame(t(m.mpg.disp))

要获得与您的数据框完全相同的数据框,可以使用finaldf的第一行作为变量名称,并删除与gearmean.mpg.disp对应的行(平均值+差值之和。

names(finaldf) <- as.matrix(finaldf[1, ])
finaldf <- finaldf[-c(1,2,7), ]
finaldf[] <- lapply(finaldf, function(x) type.convert(as.character(x)))
finaldf

我从php-fpm

借来的最后一步

结果(只显示前三列):

      AMC Javelin Cadillac Fleetwood Camaro Z28
 mpg         15.2               10.4       13.3
 cyl          8.0                8.0        8.0
 disp       304.0              472.0      350.0
 hp         150.0              205.0      245.0