R 語言 資料切片,對每個切片組分別操作
阿新 • • 發佈:2019-02-03
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呼叫的函式傳遞第二個引數。