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调用的函数传递第二个参数。