1. 程式人生 > >R 語言 資料切片,對每個切片組分別操作

R 語言 資料切片,對每個切片組分別操作

R語言中處理frame資料框,根據某一列進行切片分組,之後對每一組進行排序、挑選等操作。

用到的函式主要是splite() lapply() sapply() 其中sapply()可以能夠簡化輸出形式,即如果能把列表簡化成矩陣形式那麼就轉化,如果不能就輸出列表。

在下面這個例子中,對於資料框,依據"group"列分為三組,對於每一組,我們依據"value"列進行排序,當出現排序值一樣的時候,再依據"number"進行排序:

> group <- sample(letters[1:3],10,replace=TRUE)
> number <- sample(1:4,10,replace=TRUE)
> value <- sample(c(1.2,2.1,0.5,0.8,1.5),10,replace=TRUE)
> testData <- data.frame(group,number,value)
> groupData <- split(testData, testData$group)
> groupData
$a
  group number value
3     a      4   0.8
4     a      4   0.8
5     a      3   1.2

$b
  group number value
2     b      3   1.2
6     b      3   2.1
8     b      3   1.2

$c
   group number value
1      c      1   2.1
7      c      4   1.2
9      c      2   1.5
10     c      3   1.5

> orderData <- lapply(groupData, function(x){x[order(x[,3],x[,2]),]})
> orderData
$a
  group number value
3     a      4   0.8
4     a      4   0.8
5     a      3   1.2

$b
  group number value
2     b      3   1.2
8     b      3   1.2
6     b      3   2.1

$c
   group number value
7      c      4   1.2
9      c      2   1.5
10     c      3   1.5
1      c      1   2.1

> selectData <- sapply(orderData, function(x,y){x[y,]}, 2)
> selectData
       a        b        c       
group  factor,1 factor,1 factor,1
number 4        3        2       
value  0.8      1.2      1.5     
> selectData <- sapply(orderData, function(x,y){x[y,]}, 4)
> selectData
       a        b        c       
group  factor,1 factor,1 factor,1
number NA       NA       1       
value  NA       NA       2.1     
> 
解釋:

在上邊程式碼中 ,

groupData <- split(testData, testData$group) 語句把資料框分片;

orderData <- lapply(groupData, function(x){x[order(x[,3],x[,2]),]}) 把每一個分片資料框進行排序,其中內部自定函式中x[order(x[,3],x[,2]),] 可以先按照第三列再按照第二列排序;

selectData <- sapply(orderData, function(x,y){x[y,]}, 2) 該語句中通過自定一個2輸入引數的函式,來給sapply呼叫的函式傳遞第二個引數。