R语言——summarise和mutate函数

本文详细介绍了R语言中plyr包的summarise()和mutate()函数的使用方法及区别。summarise()用于数据汇总,返回只包含汇总结果的数据框;mutate()用于数据修改,返回原始数据加修改结果的数据框。通过实例演示了如何应用这两个函数对数据进行修改和汇总。

summarise()和mutate()是plyr包中的两个函数。

summarise()函数

用法:

summarise(.data, ...)

参数:

.data	
the data frame to be summarised

...	
further arguments of the form var = value

mutate()函数

用法:

mutate(.data, ...)

参数:

.data	
the data frame to transform

...	
named parameters giving definitions of new columns.

参考:http://xukuang.github.io/blog/2014/06/dots-in-plyr-of-r-packages/

summarisemutate函数都可以对一个数据框的某一列(而不是整个数据框)进行修改和汇总,两者的主要区别在于返回结果的方式不同,其中summarise函数返回一个只包含修改或汇总后数据的数据框,而mutate函数则返回一个由原始数据和修改或汇总后数据两部分构成的数据框(mutate函数与基础包的transform函数相似,两者的区别在于;muate函数可以对刚刚建立起来的列进行计算,而transform函数只能针对数据的原始列进行计算)。

示例:

require(plyr)
set.seed(1) # 保证每次产生的数据框的唯一性
dfx <- data.frame(
  group = c(rep('A', 8), rep('B', 15), rep('C', 6)),
  sex = sample(c("M", "F"), size = 29, replace = TRUE),
  age = sample(20:30, size = 29, replace = TRUE),
  worktime = sample(1:5, size = 29, replace = TRUE)
)
### 数据修改
summarise(dfx, age = age + 1) # 返回一个只含一列age的数据框
mutate(dfx, age = age + 1) # 返回一个和dfx列数一样的4列数据框,但age列的数值已经修改
### 数据汇总
summarise(dfx, mean.age = mean(age), sd.age = sd(age)) # 返回一个只含汇总结果的2列数据框
mutate(dfx, mean.age = mean(age), sd.age = sd(age)) # 返回一个由dfx和汇总结果组成的4列数据框

 输出结果:

 dfx
   group sex age worktime
1      A   M  21        5
2      A   F  29        2
3      A   M  28        1
4      A   M  20        3
5      A   F  23        3
6      A   M  22        4
7      A   M  25        3
8      A   M  29        1
9      B   F  29        4
10     B   F  25        5
11     B   M  23        1
12     B   M  23        1
13     B   M  29        4
14     B   M  28        5
15     B   M  26        5
16     B   F  25        4
17     B   F  28        5
18     B   F  27        4
19     B   F  28        4
20     B   M  26        1
21     B   M  27        5
22     B   M  25        5
23     B   M  29        1
24     C   M  26        1
25     C   M  22        3
26     C   M  29        2
27     C   F  25        2
28     C   M  27        3
29     C   M  21        2
summarise(dfx, age = age + 1)
   age
1   22
2   30
3   29
4   21
5   24
6   23
7   26
8   30
9   30
10  26
11  24
12  24
13  30
14  29
15  27
16  26
17  29
18  28
19  29
20  27
21  28
22  26
23  30
24  27
25  23
26  30
27  26
28  28
29  22
mutate(dfx, age = age + 1)
   group sex age worktime
1      A   M  22        5
2      A   F  30        2
3      A   M  29        1
4      A   M  21        3
5      A   F  24        3
6      A   M  23        4
7      A   M  26        3
8      A   M  30        1
9      B   F  30        4
10     B   F  26        5
11     B   M  24        1
12     B   M  24        1
13     B   M  30        4
14     B   M  29        5
15     B   M  27        5
16     B   F  26        4
17     B   F  29        5
18     B   F  28        4
19     B   F  29        4
20     B   M  27        1
21     B   M  28        5
22     B   M  26        5
23     B   M  30        1
24     C   M  27        1
25     C   M  23        3
26     C   M  30        2
27     C   F  26        2
28     C   M  28        3
29     C   M  22        2
> summarise(dfx, mean.age = mean(age), sd.age = sd(age))
  mean.age   sd.age
1 25.68966 2.804377
> mutate(dfx, mean.age = mean(age), sd.age = sd(age))
   group sex age worktime mean.age   sd.age
1      A   M  21        5 25.68966 2.804377
2      A   F  29        2 25.68966 2.804377
3      A   M  28        1 25.68966 2.804377
4      A   M  20        3 25.68966 2.804377
5      A   F  23        3 25.68966 2.804377
6      A   M  22        4 25.68966 2.804377
7      A   M  25        3 25.68966 2.804377
8      A   M  29        1 25.68966 2.804377
9      B   F  29        4 25.68966 2.804377
10     B   F  25        5 25.68966 2.804377
11     B   M  23        1 25.68966 2.804377
12     B   M  23        1 25.68966 2.804377
13     B   M  29        4 25.68966 2.804377
14     B   M  28        5 25.68966 2.804377
15     B   M  26        5 25.68966 2.804377
16     B   F  25        4 25.68966 2.804377
17     B   F  28        5 25.68966 2.804377
18     B   F  27        4 25.68966 2.804377
19     B   F  28        4 25.68966 2.804377
20     B   M  26        1 25.68966 2.804377
21     B   M  27        5 25.68966 2.804377
22     B   M  25        5 25.68966 2.804377
23     B   M  29        1 25.68966 2.804377
24     C   M  26        1 25.68966 2.804377
25     C   M  22        3 25.68966 2.804377
26     C   M  29        2 25.68966 2.804377
27     C   F  25        2 25.68966 2.804377
28     C   M  27        3 25.68966 2.804377
29     C   M  21        2 25.68966 2.804377

 

你现在是一名蓝牙工程师,讲解下面的log: 搜索 "bta_ag_sco_event" (1个文件中匹配到36次,总计查找1次) C:\Users\rivotek\Downloads\0728\log\20250728165337.main.log (匹配36次) 行 191380: 07-28 16:50:01.297 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0xffff state:BTA_AG_SCO_SHUTDOWN_ST[0] event:BTA_AG_SCO_LISTEN_E[0] 行 191382: 07-28 16:50:01.297 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_SHUTDOWN_ST(0x00)]->[BTA_AG_SCO_LISTEN_ST(0x01)] after event [BTA_AG_SCO_LISTEN_E(0x00)] 行 274756: 07-28 16:51:47.576 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0xffff state:BTA_AG_SCO_LISTEN_ST[1] event:BTA_AG_SCO_OPEN_E[1] 行 274763: 07-28 16:51:47.576 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_LISTEN_ST(0x01)]->[BTA_AG_SCO_CODEC_ST(0x02)] after event [BTA_AG_SCO_OPEN_E(0x01)] 行 276340: 07-28 16:51:47.882 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0xffff state:BTA_AG_SCO_CODEC_ST[2] event:BTA_AG_SCO_OPEN_E[1] 行 276341: 07-28 16:51:47.882 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:950 bta_ag_sco_event: BTA_AG_SCO_CODEC_ST: Ignoring event BTA_AG_SCO_OPEN_E[1] 行 276479: 07-28 16:51:47.905 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0xffff state:BTA_AG_SCO_CODEC_ST[2] event:BTA_AG_SCO_CN_DONE_E[3] 行 276501: 07-28 16:51:47.908 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_CODEC_ST(0x02)]->[BTA_AG_SCO_OPENING_ST(0x03)] after event [BTA_AG_SCO_CN_DONE_E(0x03)] 行 276686: 07-28 16:51:47.939 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0x0000 state:BTA_AG_SCO_OPENING_ST[3] event:BTA_AG_SCO_CONN_OPEN_E[7] 行 276687: 07-28 16:51:47.939 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_OPENING_ST(0x03)]->[BTA_AG_SCO_OPEN_ST(0x06)] after event [BTA_AG_SCO_CONN_OPEN_E(0x07)] 行 295009: 07-28 16:51:56.779 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0x0000 state:BTA_AG_SCO_OPEN_ST[6] event:BTA_AG_SCO_CLOSE_E[5] 行 295014: 07-28 16:51:56.779 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_OPEN_ST(0x06)]->[BTA_AG_SCO_CLOSING_ST(0x07)] after event [BTA_AG_SCO_CLOSE_E(0x05)] 行 295580: 07-28 16:51:56.838 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0xffff state:BTA_AG_SCO_CLOSING_ST[7] event:BTA_AG_SCO_CONN_CLOSE_E[8] 行 295583: 07-28 16:51:56.838 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_CLOSING_ST(0x07)]->[BTA_AG_SCO_LISTEN_ST(0x01)] after event [BTA_AG_SCO_CONN_CLOSE_E(0x08)] 行 311318: 07-28 16:52:09.208 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0x0000 state:BTA_AG_SCO_LISTEN_ST[1] event:BTA_AG_SCO_OPEN_E[1] 行 311321: 07-28 16:52:09.208 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0xffff state:BTA_AG_SCO_CODEC_ST[2] event:BTA_AG_SCO_CN_DONE_E[3] 行 311328: 07-28 16:52:09.209 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_CODEC_ST(0x02)]->[BTA_AG_SCO_OPENING_ST(0x03)] after event [BTA_AG_SCO_CN_DONE_E(0x03)] 行 311329: 07-28 16:52:09.209 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_LISTEN_ST(0x01)]->[BTA_AG_SCO_OPENING_ST(0x03)] after event [BTA_AG_SCO_OPEN_E(0x01)] 行 311470: 07-28 16:52:09.233 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0x0000 state:BTA_AG_SCO_OPENING_ST[3] event:BTA_AG_SCO_CONN_OPEN_E[7] 行 311471: 07-28 16:52:09.233 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_OPENING_ST(0x03)]->[BTA_AG_SCO_OPEN_ST(0x06)] after event [BTA_AG_SCO_CONN_OPEN_E(0x07)] 行 332093: 07-28 16:52:25.731 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0x0000 state:BTA_AG_SCO_OPEN_ST[6] event:BTA_AG_SCO_CLOSE_E[5] 行 332099: 07-28 16:52:25.732 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_OPEN_ST(0x06)]->[BTA_AG_SCO_CLOSING_ST(0x07)] after event [BTA_AG_SCO_CLOSE_E(0x05)] 行 332393: 07-28 16:52:25.768 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0xffff state:BTA_AG_SCO_CLOSING_ST[7] event:BTA_AG_SCO_CONN_CLOSE_E[8] 行 332396: 07-28 16:52:25.768 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_CLOSING_ST(0x07)]->[BTA_AG_SCO_LISTEN_ST(0x01)] after event [BTA_AG_SCO_CONN_CLOSE_E(0x08)] 行 364380: 07-28 16:53:51.605 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0x0000 state:BTA_AG_SCO_LISTEN_ST[1] event:BTA_AG_SCO_OPEN_E[1] 行 364383: 07-28 16:53:51.605 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0xffff state:BTA_AG_SCO_CODEC_ST[2] event:BTA_AG_SCO_CN_DONE_E[3] 行 364393: 07-28 16:53:51.605 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_CODEC_ST(0x02)]->[BTA_AG_SCO_OPENING_ST(0x03)] after event [BTA_AG_SCO_CN_DONE_E(0x03)] 行 364394: 07-28 16:53:51.605 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_LISTEN_ST(0x01)]->[BTA_AG_SCO_OPENING_ST(0x03)] after event [BTA_AG_SCO_OPEN_E(0x01)] 行 368083: 07-28 16:53:52.026 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0x0000 state:BTA_AG_SCO_OPENING_ST[3] event:BTA_AG_SCO_OPEN_E[1] 行 368084: 07-28 16:53:52.026 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1015 bta_ag_sco_event: BTA_AG_SCO_OPENING_ST: Ignoring event BTA_AG_SCO_OPEN_E[1] 行 368806: 07-28 16:53:52.121 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0x0000 state:BTA_AG_SCO_OPENING_ST[3] event:BTA_AG_SCO_CONN_OPEN_E[7] 行 368808: 07-28 16:53:52.121 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_OPENING_ST(0x03)]->[BTA_AG_SCO_OPEN_ST(0x06)] after event [BTA_AG_SCO_CONN_OPEN_E(0x07)] 行 394142: 07-28 16:54:10.988 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0x0000 state:BTA_AG_SCO_OPEN_ST[6] event:BTA_AG_SCO_CLOSE_E[5] 行 394144: 07-28 16:54:10.989 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_OPEN_ST(0x06)]->[BTA_AG_SCO_CLOSING_ST(0x07)] after event [BTA_AG_SCO_CLOSE_E(0x05)] 行 394584: 07-28 16:54:11.058 3703 4045 I bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:822 bta_ag_sco_event: device:xx:xx:xx:xx:ba:5f index:0xffff state:BTA_AG_SCO_CLOSING_ST[7] event:BTA_AG_SCO_CONN_CLOSE_E[8] 行 394587: 07-28 16:54:11.058 3703 4045 W bluetooth: packages/modules/MiuiBluetooth/system/bta/ag/bta_ag_sco.cc:1331 bta_ag_sco_event: SCO_state_change: [BTA_AG_SCO_CLOSING_ST(0x07)]->[BTA_AG_SCO_LISTEN_ST(0x01)] after event [BTA_AG_SCO_CONN_CLOSE_E(0x08)]
07-30
### 三级标题:蓝牙日志分析:解读bta_ag_sco_event事件及其状态转换流程 在蓝牙通信中,`bta_ag_sco_event`事件是蓝牙音频网关(AG)模块中用于处理SCO链路状态变化的核心机制SCO链路蓝牙HFP(Hands-Free Profile)协议中的重要组成部分,用于传输高质量的语音数据,尤其是在接听电话时建立音频连接[^1]。 在日志中,`bta_ag_sco_event`事件通常伴随着状态变化,例如SCO连接建立、断开、重新连接等。这些事件由蓝牙协议栈中的`bta_ag_sco_open`函数触发,其调用时机决定了SCO链路建立方式和时机[^1]。例如: ```c bta_ag_sco_open(p_scb, p_data); ``` 该函数的调用会引发一系列状态变化事件,包括但不限于: - `BTA_AG_SCO_OPEN_EVT`: 表示SCO链路已成功打开。 - `BTA_AG_SCO_CLOSE_EVT`: 表示SCO链路已关闭。 - `BTA_AG_SCO_CONN_EVT`: 表示SCO连接建立。 - `BTA_AG_SCO_DISCONN_EVT`: 表示SCO连接已断开。 这些事件的处理流程通常在`bta_ag_sco_event`函数中完成,该函数会根据当前的状态和事件类型执行相应的操作。例如,在接听电话时,`bta_ag_send_call_inds`函数会被调用,用于发送呼叫状态指示,从而触发SCO链路建立[^1]。 ```c bta_ag_send_call_inds(p_scb, p_data); ``` 在日志中,可以观察到`bta_ag_sco_event`相关的状态变化信息,例如: ``` 07-28 16:53:53.334 1389 15250 I PAL: Stream: connectStreamDevice_l: 1180: stream is already connected to device 29 name PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET - return ``` 该日志表明音频流已经连接蓝牙SCO耳机设备,表明SCO链路已经成功建立。 此外,`bta_ag_sco_event`事件的处理还涉及到底层协议栈的交互,例如RFCOMM协议。RFCOMM协议用于模拟串口通信,确保音频数据能够正确传输。在日志中,可以观察到相关的调用信息,例如: ``` 07-28 16:50:01.995 1584 5947 D APM::HwModule: createDevice: adding dynamic device AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, @:SUPPRESSED to module primary ``` 该日志表明系统正在创建蓝牙SCO耳机设备,并将其添加到音频硬件模块中,为后续的音频流传输做好准备[^1]。 在处理`bta_ag_sco_event`事件时,还需要考虑两种不同的音频连接模式:inband和no-inband。这两种模式在HFP规范中定义了不同的SCO链路建立流程。例如,inband模式要求在接听电话之前建立SCO链路,而no-inband模式则允许在电话接通之后建立链路[^1]。 ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值