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




  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值