数据集的百分比

时间:2015-11-21 18:36:57

标签: r

一个非常基本的问题,因为我是R的新手。 我所拥有的是数据框中的数据:

     DESCRI   Region     area
1    Houses   1          1.225305e-04
2    Gardens  1          5.444932e-04
3    Forest   1          6.151541e-04
4    Lake     1          2.903044e-05
5    Sea      1          2.451042e-04
6    Houses   2          2.739274e-06
7    Gardens  2          1.223057e-04
8    Forest   2          3.869934e-04
9    Lake     2          3.945288e-06
10   Sea      2          1.884626e-06

我需要这样的东西:

     Region 1: X% Houses
               Y% Gardens
               Z% Forest
               V% Lake
               Y% Sea

     Region 2: X% Houses
               Y% Gardens
               Z% Forest
               V% Lake
               Y% Sea

data.table包可能以某种方式执行此操作,但我还没有找到解决方案。我设法获得的是百分比的附加列。

     DESCRI   Region     area           perc
1    Houses   1          1.225305e-04   0.03e-04
2    Gardens  1          5.444932e-04   0.02e-04

2 个答案:

答案 0 :(得分:1)

由于您是R的新手,因此使用for循环以完全透明的方式了解如何执行此操作可能是值得的。这是一种可能性:

var alarmSchema = new Schema({
        timestamp : Number,
        dateTime : String, //yyyymmddhhss
        difference : Number,
        actionTaken : String, //"send sms"

});

var deviceSchema = new Schema({
   deviceId: {
        type : String,
        index : {
            unique : true,
            dropDups : true
        }
    },
    alarms : [alarmSchema]
});

请注意,为此,您需要先对原始数据框进行排序,以便区域全部按升序排列。区域内土地覆盖类别的顺序无关紧要,甚至可能在区域之间不一致。

答案 1 :(得分:1)

我们可以使用data.table

 str1 <- setDT(df1)[,ArSum:= sum(area) , by = Region
     ][, as.character(round(100*(area/ArSum),2)), by = .(DESCRI,Region)
      ][, paste(sprintf('%s%% %s', V1, DESCRI),collapse='\n'), by = Region
        ][, paste0('Region ', Region,':', V1)]
 cat(paste(str1, collapse='\n\n\n'),'\n')
# Region 1:7.87% Houses
#34.99% Gardens
#39.53% Forest
#1.87% Lake
#15.75% Sea


#Region 2:0.53% Houses
#23.62% Gardens
#74.73% Forest
#0.76% Lake
#0.36% Sea