精华内容
下载资源
问答
  • 依靠gridcontrol强大的属性功能实现分组,并依据分组总计,平均统计等。本实例根据班级分组计算班级总分与平均分。
  • RecyclerView 实现分组展示;与iOS 类似的展示方式,可以随意调节数据多少,不仅限于只添加head和footer
  • RecyclerView 分组 item实现不同布局
  • wpf dataGrid 分组

    热门讨论 2013-05-03 17:08:40
    wpf dataGrid 分组,能展开与折叠
  • jqGrid表格自带group分组功能,包括表头Header分组和表格内容分组功能,本文讨论表格行如何实现分组统计;表格行新增、删除时如何自动更新分组统计;表格行汇总列单元格编辑室如何更新分组统计;如何动态实现分组...

      jqGrid表格自带group分组功能,包括表头Header分组和表格内容分组功能,本文讨论表格行如何实现分组统计;表格行新增、删除时如何自动更新分组统计;表格行汇总列单元格编辑室如何更新分组统计。

    1、jqGrid grouping使用说明(用户手册)

    1)启用分组

    启用分组,包含2部分内容:

    • 设置grouping: true,配置groupingView(分组字段、排序规则、是否显示分组列、是否显示合计行groupSummary,默认展开还是收起等)
    jQuery("#grid").jqGrid({
      grouping: true,
      groupingView : {
         groupField : ['name', 'invdate'],
         groupOrder : ['asc', 'desc']
      }
      ...
    });
    
    • 设置colModel,合计类型summaryType
    {name:'amount', formatter:'number', summaryType:'sum'},
    
    2)grouping 相关选项、参数说明
    PropertyTypeDescriptionDefault
    groupFieldarray数组,分组字段,2个字段则2层分组,第1字段为第1层分组,第2字段为第二层分组empty
    groupOrderarray数组,分组排序规则,[‘asc’, ‘desc’]表示第1分组升序,第二分组降序empty
    groupTextarray数组,分组标题显示文本,如:[’{0}, 共{1}’],{0}表示分组字段值,{1}表示分组统计值。empty
    groupColumnShowarrayShow/Hide the column on which we group. The value here should be a boolean true/false for the group level. If the grouping is enabled we set this value to true.empty
    groupSummaryarrayEnable or disable the summary (footer) row of the current group level. If grouping is set the default value for the group is false.empty
    groupSummaryPosarraySet the position of the summary row at current group level. Possible values - header or footer. If set to header the summary values are placed at the same row where the group values is. If footer is set additional row at end of the group level is build-ed and the summary values are placed herefooter
    hideFirstGroupColbooleanIf set to true the values at first column are replaced with empty ones so that we have a pretty view. This usually is set ih the first column is a group columnfalse
    showSummaryOnHidebooleanShow or hide the summary (footer) row when we collapse the group.false
    groupCollapsebooleanDefines if the initially the grid should show or hide the detailed rows of the group.false
    plusiconstringSet the icon from jQuery UI Theme Roller or Bootstrap that will be used if the grouped row is collapsed. The default is get from styleUI object property grouping for the CSS framework used
    minusiconstringSet the icon from jQuery UI Theme Roller or Bootstrap that will be used if the grouped row is expanded. The default is get from styleUI object property grouping for the CSS framework used
    isInTheSameGrouparrayThe elements of the array correspond to the number of the groups. Every element of this array is a function which should return true or false. In case if it return false the element will be added in the new group. Parameters passed to this function are : previous value, current value, group index, group objectnull
    formatDisplayFieldarrayThe elements of the array correspond to the number of the groups. Every element of this array is a function which should return a value, which will be display the grouped value. Parameters passed to this function are: current value, source value, colModel option, group index and group object.null

    支持的合计类型:summaryType

    • sum - apply the sum function to the current group value and return the result
    • count - apply the count function to the current group value and return the result
    • avg - apply the average function to the current group value and return the result
    • min - apply the min function to the current group value and return the result
    • max - apply the max function to the current group value and return the result
    • function - use custom function for calculations.
    3)grouping 相关 方法
    • groupingToggle(string groupid)
      展开、收起指定分组

    • 动态定义分组 groupingGroupBy(mixed name, [object options])
      Perform a grouping by given name. The previous grouping is destroyed and new one is applied. A set of additional options can be set with the option parameter. The groupingView object is extended with the options parameter.
      可用此方法实现分组全部展开或收起。

    2、Grouping Demo说明

    1)html源码
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8" />
    	<title>jgGrid-Group</title>
    	<link rel="stylesheet" href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
    	<link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.5.0/css/font-awesome.min.css" />
    	<link rel="stylesheet" href="https://cdn.bootcss.com/jqueryui/1.11.0/jquery-ui.min.css" />
    	<link rel="stylesheet" href="https://js.cybozu.cn/jqgrid/v5.3.1/css/ui.jqgrid.css" />
    	<script src="https://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    	<script src="https://js.cybozu.cn/jqgrid/v5.3.1/js/jquery.jqGrid.min.js"></script>
    	<script src="https://js.cybozu.cn/jqgrid/v5.3.1/js/i18n/grid.locale-en.js"></script>
    </head>
    <body>
    <div class="page-content container">
    	<div class="page-body"> <!-- page-body -->
    		<div class="panel panel-default" id="panel-orders">
    			<div class="panel-heading">
    				<h3 class="panel-title">jgGrid-Group 新增、删除行重新汇总计算
    					<button type="button" class='btn btn-sm btn-default' onclick='addRow()'>新增车型2</button>
    					<button type="button" class='btn btn-sm btn-default' onclick='doExpand()'>展开所有行</button>
    					<button type="button" class='btn btn-sm btn-default' onclick='doCollapse()'>收起所有行</button></h3>
    			</div>
    			<table id="orders"></table>
    		</div>
    	</div>
    </div>
    <script type="text/javascript">
    	var data = [], rowIds = [], goods_count = 0, out_count = 0;
    	function getBills() {
    		var rowCount = 10;
    		for (var i = 0; i < rowCount; i ++) {
    			data.push({
    				id: i + 10,
    				car_type: '车型' + ((i % 5) + 1),
    				goods_id: i,
    				goods_no: i + 1,
    				goods_name: '零件名称' + rowCount + i,
    				package_name: '包装器具' + rowCount + i,
    				unit_name: '单位',
    				snp: 0.89,
    				box_count: rowCount + i,
    				total_count: rowCount + i,
    				goods_count: rowCount + i,
    				out_count: rowCount + i,
    				bill_no: 'BN0000000' + i,
    				barcode: '1000000000' + i,
    				flag:  i >= rowCount - 1 ? 1 : 0,
    			})
    		}
    		$("#orders").jqGrid("clearGridData").jqGrid('setGridParam',{data: data || []}).trigger('reloadGrid');
    	}
        function setSum(rowId, colName, countDiff) {
            var $tr = $('#' + rowId).nextAll('.jqfoot').first(), 
                $count = $tr.find('td[aria-describedby="orders_{0}"]'.replace('{0}', colName));
            $count.text(parseFloat($count.text()) + parseFloat(countDiff));
        }
        function oprRender(data, options, row) {
        	return "<button type='button' class='btn btn-primary btn-xs' οnclick='delRow(this)'>删除</button>"
        }
        function delRow(obj) {
        	var rowId = $(obj).closest('tr').attr('id');
        	if (confirm('确定要删除该行吗?')) {
        		$("#orders").jqGrid('delRowData', rowId);
        		$("#orders").jqGrid().trigger('reloadGrid');
        	}
        }
        function addRow() {
        	var row = {id: $.jgrid.randId(), car_type: "车型2", goods_no: '12003', goods_name: "12003", goods_count: 9, out_count: 8}
        	$("#orders").jqGrid('addRowData', row.id, row);
        	$("#orders").jqGrid().trigger('reloadGrid');
        }
        function doExpand() {
        	$("#orders").jqGrid('groupingGroupBy', 'car_type', {groupCollapse: false});
        }
        function doCollapse() {
        	$("#orders").jqGrid('groupingGroupBy', 'car_type', {groupCollapse: true});
        }
    	$(function() {
    		$("#orders").jqGrid({
    			colModel: [
    				{label: "车型", name: "id", width: 70, hidden:true},
    				{label: "车型", name: "car_type", width: 70},
    				{label: "零件号", name: "goods_no", width: 60},
    				{label: "零件名称", name: "goods_name", width: 180},
    				{label: "包装器具", name: "package_name", width: 70},
    				{label: "单位", name: "unit_name", width: 40},
    				{label: "装箱率", name: "snp", width: 50, sorttype: "number"},
    				{label: "箱数", name: "box_count", width: 40, sorttype: "number"},
    				{label: "需求数量", name: "goods_count", width: 70, summaryType: 'sum', editable: true, editrules:{rquired: true, number: true}},
    				{label: "出库数量", name: "out_count", width: 70, sorttype: "number", summaryType: 'sum', editable: true, editrules:{rquired: true, number: true}},
    				{label: "订单号", name: "bill_no", width: 120},
    				{label: "操作", name: "oprRender", width: 120, formatter: oprRender}
    			],
    			datatype: 'local',
    			rownumbers: true,
    			height: 300,
    			grouping: true,
    	        groupingView: {
    	            groupField: ["car_type",],
    	            groupColumnShow: [false],
    	            groupText: ["<b style='display: inline-block;width: 130px;'>{0}</b>"],
    	            groupOrder: ["asc"],
    	            groupSummary: [true],
    	            groupCollapse: false
    	        },
                beforeEditCell: function(rowId, cellname, value, iRow, iCol) {
                    if (cellname == "goods_count") {
                    	goods_count = value;
                    } else if (cellname == "out_count") {
                    	out_count = value;
                    }
                },
    	       	afterSaveCell: function(rowId, cellname, value, iRow, iCol) {
    				if (cellname == "goods_count") {
    					setSum(rowId, "goods_count", value - goods_count);
    				} else if (cellname == "out_count") {
                        setSum(rowId, "out_count", value - out_count);
                    }
    	        },
    			cellEdit: true,
    			cellsubmit: 'clientArray'
    		});
    		getBills();
    	});
    </script>
    </body>
    </html>
    
    2)代码说明
    • 新增行、删除行后都调用了jqGrid().trigger(‘reloadGrid’),否则不会重新进行合计汇总;
    • 修改单元格值时

    先用beforeEditCell记录了单元格原值
    后用afterSaveCell获取新值,比计算新旧值的差值, count_diff
    调用setSum方法更新汇总统计行的统计值,新统计值 = 原统计值 + count_diff

    • 调用groupingGroupBy实现展开、收起分组
    • 为了避免删除行,调用jqGrid().trigger(‘reloadGrid’)后可能导致reload数据与删除行后的表格内容不一致问题,表格行数据都包含id属性且唯一。
    展开全文
  • Android仿QQ好友列表分组实现增删改及持久化Demo
  • 这个程序有BUG,已修改,从这里下载吧... 说明: 1.每次搞活动都需要分组,比如20个人分3个组,如何才能更公平的分组,想到的只能是随机分组程序。 2.时间关系并没有实现男女平衡的分组,有时间的哥们可以自己实现。
  • ListView分组显示

    热门讨论 2012-04-27 17:09:40
    实现类似QQ分组显示的效果和手机联系人列表的效果。
  • 分组密码

    千次阅读 2018-06-02 22:05:42
    一个分组的比特数就称为分组长度(block lenght)。 例如 DES和3DES的分组长度都是64比特。AES的分组长度为128比特。 流密码(stream cipher)是对数据流进行连续处理的一类密码算法。流密码中一般以1比...

    密码算法可以分为分组密码和流密码两种

    • 分组密码(block cipher)是每次只能处理特定长度的一块数据的一类密码算法,这里的“一块”就称为分组(block)。一个分组的比特数就称为分组长度(block lenght)。

      例如 DES和3DES的分组长度都是64比特。AES的分组长度为128比特。

    • 流密码(stream cipher)是对数据流进行连续处理的一类密码算法。流密码中一般以1比特、8比特、或32比特等为单位进行加密和解密。

    分组密码处理完一个分组就结束了,因此不需要通过内部状态来记录加密的进度;相对地,流密码是对一串数据进行连续处理,因此需要保持内部状态。

    模式

    分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式(mode)。

    • ECB模式:Electronic CodeBook mode(电子密码模式)
    • CBC模式:Cipher Block Chaining mode(密码分组链接模式)
    • CFB模式:Cipher FeedBack mode(密文反馈模式)
    • OFB模式:Output FeedBack mode(输出反馈模式)
    • CTR模式:CounTeR mode(计数器模式)

    ECB模式

    在ECB模式中,将明文分组加密之后的结果直接成为密文分组。当最后一个明文分组的内容小于分组长度时,需要用一些特定的数据进行填充(padding)。

    明文分组:是指分组密码算法中作为加密对象的明文。
    密文分组:是指使用分组密码算法中将明文分组加密之后所生成的密文。

    image

    使用 ECB 模式加密时,相同的明文分组会转换为相同的密文分组,也就是说,我们可以将其理解为是一个巨大的“明文分组->密文分组”的对应表,因此 ECB 模式也称为 电子密码本模式

    ECB模式的特点

    ECB模式是所有模式中最简单的一种。ECB的明文分组与密文分组是一一对应的关系,因此,如果明文中存在多个相同的明文分组,则这些明文分组最终都会将被转换为相同的密文分组。这样一来,只要观察一下密文,就可以知道明文中存在怎样的重复组合,并可以以此为线索来破译密码,因此ECB模式是存在风险的。

    对ECB模式的攻击

    假如存在主动攻击者Mallory,它能够改变密文分组的顺序。当接收者对密文进行解密时,由于密文分组的顺序被改变了,因此相应的明文分组的顺序也会改变。也就是说,攻击者Mallory无需破译密码就能够操纵明文。

    列举一个银行转账的简单例子,假设某银行转账数据由以下3个分组构成。

    分组1 = 付款人的银行账号
    分组2 = 收款人的银行账号
    分组3 = 转转金额

    我们可以制作一个“从 A 账号 向 B账号转账1000元”的数据,用16进制数据表示如下:

    明文分组1 = 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 (付款人:A)
    
    明文分组2 = 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30  (收款人: B)
    
    明文分组3 = 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40  (转账金额: 1000)

    经过 ECB模式进行加密,

    密文分组1 = 1A 2C 1A 2C 1A 2C 1A 2C 1A 2C 1A 2C 1A 2C 1A 2C (付款人:*)
    
    密文分组2 = 2D 3F 2D 3F 2D 3F 2D 3F 2D 3F 2D 3F 2D 3F 2D 3F (收款人: *)
    
    密文分组3 = 4D 5E 4D 5E 4D 5E 4D 5E 4D 5E 4D 5E 4D 5E 4D 5E (转账金额: **)

    如果攻击者 Mallory 将密文分组1 和 2 内容对调,

    密文分组1 = 2D 3F 2D 3F 2D 3F 2D 3F 2D 3F 2D 3F 2D 3F 2D 3F (付款人: *)
    
    密文分组2 = 1A 2C 1A 2C 1A 2C 1A 2C 1A 2C 1A 2C 1A 2C 1A 2C (收款人:*)
    
    密文分组3 = 4D 5E 4D 5E 4D 5E 4D 5E 4D 5E 4D 5E 4D 5E 4D 5E (转账金额: **)

    那请求内容从A向B转账1000,变成了B向A转账1000。我们可以看出ECB模式的缺点是可以在不破译密文的情况下操纵明文。

    CBC模式

    CBC模式,全称Cipher Block Chaining模式,译为密文分组链接模式,即加密算法的输入是上一个密文分组和下一个明文分组的异或。因为是将上一个密文分组和下一个明文分组的内容混合加密,因此可以避免ECB模式的缺陷。当加密第一个明文分组时,由于不存在上一个密文分组,因此需要准备与分组等长的初始化向量IV,来代替上一个密文分组。

    image

    初始化向量:当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量,通常缩写为IV。

    func NewCBCEncrypter(b Block, iv []byte) BlockMode

    当我们使用 CBC模式的时候,需要传入 iv(初始化向量)

    CBC模式的特点

    • 明文分组在加密之前一定会与“前一个密文分组”进行XOR运算,因此即便明文分组1和2的值是相等的,密文分组1和2的值也不一定是相等的。这样ECB模式的缺陷在CBC模式中就不存在了。

    • 在CBC模式中,无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组3,则至少需要凑齐明文分组1、2、3才行。

    • 如果密文分组中有一些比特缺失了,即便只缺失了1比特,那么缺失比特的位置之后的密文分组也就全部无法解密了。

    对CBC模式的攻击

    假设主动攻击者Mallory的目的是通过修改密文来操纵解密后的明文。如果Mallory能够对初始化向量中任意比特进行反转,则解密后得到的明文分组中相应的比特也会被反转。

    image

    CFB模式

    CFB模式,全称Cipher FeedBack模式,译为密文反馈模式,即上一个密文分组作为加密算法的输入,输出与明文异或作为下一个分组的密文。在CFB模式中,明文分组和密文分组之间只有一次异或。

    image

    CFB模式与一次性密码本相似,都是通过将明文与随机比特序列进行异或运算来生成密文。但由于CFB模式中密码算法的输出是通过计算得到的,并非真正的随机数,因此不具备一次性密码本那样理论上不可破译的性质。CFB模式可以看做使用分组方式实现流密码的方式。

    对CFB模式的攻击

    对CFB模式可以实施 重放攻击(replay attack)

    有一天 A 向 B 发送了一条消息,这条消息由4个密文分组组成,攻击者将后3个密文分组保存下来,第二天,A又向 B 发送内容不同的4个密文分组,攻击者将后3个密文分组进行替换。解密的时候就会发现第一个可以解密正确,第2个会出现错误,而第3个和第4个则变成攻击者替换的内容。

    image

    OFB模式

    OFB模式,全称Output Feedback模式,译为输出反馈模式。OFB模式与CFB模式类似,只是加密算法的输入是上一次加密的输出。

    OFB模式不是通过密码算法对明文直接进行加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的。

    OFB模式加密和处理解密逻辑相同,明文与密钥流异或生成密文,密文与密钥流异或生成明文。
      
    image
      
    image

    CTR模式

    CTR模式,全称Counter模式,译为计数器模式。CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。也即最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行异或运算得到的。

    image

    CTR模式的特点

    • CTR模式的加密和解密使用了完全相同的结构,因此在程序实现上比较容易。这一特点和同为流密码的OFB模式是一样的。

    • CTR模式中可以以任意顺序对分组进行加密和解密,因此在加密和解密时需要用到的“计数器”的值可以由nonce和分组序号直接计算出来。能够以任意顺序处理分组,就以为着能够实现并行计算。在支持并行计算的系统中,CTR模式的速度是非常快的。

    错误与机密性

    • 假设CTR模式的密文分组中有一个比特被反转了,则解密后明文分组中仅有与之对应的比特会被反转,这一错误不会放大,这一弱点和OFB模式是相同的。

    • 在OFB模式中,如果对密钥流的一个分组进行加密后其结果碰巧和加密前是相同的,那么这一分组之后的密钥流就会变成同一值的不断反复。在CTR模式中就不存在这一问题。

    分组密码模式比较

    模式优点缺点备注
    ECB模式简单
    快速
    支持并行运算
    明文中的重复排列反映在密文中
    通过删除、替换密文分组可以对明文进行操作
    对包含某些比特错误的密文进行解密时对应的分组会出错
    不能抵御重放攻击
    不应使用
    CBC模式明文的重复排列不会反映在密文中
    支持并行运算(仅解密)
    能够解密任意密文分组
    对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错
    加密不支持并行运算
    CRYPRTREC推荐 《应用密码学》推荐
    CFB模式不需要填充
    支持并行计算(仅解密)
    能够解密任意密文分组
    加密不支持并行计算
    对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错
    不能抵御重放攻击
    CRYPRTREC推荐
    OFB模式不需要填充
    可事先进行加密、解密的准备
    加密、解密使用相同结构
    对包含某些错误比特的密文进行解密时,只有明文中相对应的比特会出错
    不支持并行计算
    主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转
    CRYPRTREC推荐
    CTR模式不需要填充
    可事先进行加密、解密的准备
    加密、解密使用相同结构
    对包含某些错误比特的密文进行解密时,只有明文中相对应的比特会出错
    支持并行计算(加密、解密)
    主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转CRYPRTREC推荐 《应用密码学》推荐
    展开全文
  • STATA学习笔记:分组统计和分组回归

    万次阅读 2021-03-05 21:57:59
    STATA学习笔记:分组统计和分组回归 1. 分组统计 (1)对一个类别变量进行统计时 tabulate命令 tabulate oneway //for one-way tables of frequencies tabulate twoway //for two-way tables of frequencies ...

    STATA学习笔记:分组统计和分组回归

    1. 分组统计

    (1)对一个类别变量进行统计时

    tabulate命令

    tabulate oneway
    //for one-way tables of frequencies
    
    tabulate twoway 
    //for two-way tables of frequencies
    

    graph bar命令

    graph bar  yvars [if] [in] [weight] [, options]
    

    *graph bar draws vertical bar charts.
    *In a vertical bar chart, the y axis is numerical,
    *and the x axis is categorical.

    graph hbar yvars [if] [in] [weight] [, options]
    

    *graph hbar draws horizontal bar charts.
    *In a horizontal bar chart, the numerical axis is still called the y axis,
    *and the categorical axis is still
    *called the x axis, but y is presented horizontally, and x vertically.

    sysuse nlsw88.dta, clear
    tabulate industry
    

    在这里插入图片描述

    graph bar (count) idcode,over (industry)
    

    在这里插入图片描述

    graph hbar (count) idcode,over (industry) blabel(bar,position(outside))
    //blabel选项为添加
    

    在这里插入图片描述

    sysuse citytemp
    graph bar (mean) tempjuly tempjan, over(region)   ///
    bargap(-30)   ///
    legend( label(1 "July") label(2 "January") )   ///
    ytitle("Degrees Fahrenheit")   ///
    title("Average July and January temperatures")   ///
    subtitle("by regions of the United States")   ///
    note("Source:  U.S. Census Bureau, U.S. Dept. of Commerce")
    

    在这里插入图片描述

    graph pie命令

    graph pie,over(industry)
    

    在这里插入图片描述

    graph pie,over(industry) sort
    //按照饼块大小排序,更清晰
    

    在这里插入图片描述

    (2)对多个类别变量进行统计时

    tabulate命令

    sysuse nlsw88.dta, clear
    tabulate industry collgrad
    //显示每一个行业下没有大学文凭和有大学文凭的妇女的人数
    

    在这里插入图片描述

    tabulate industry collgrad,colum nofreq
    //不显示frequency,计算每一个行业下的有文凭的妇女和没有文凭的妇女分别占妇女总人数的比重
    

    在这里插入图片描述

     tabulate industry collgrad,colum
     //既显示人数,也显示比重
    

    在这里插入图片描述

     sysuse nlsw88.dta, clear
     tabulate industry collgrad,sum (wage) means
     //以行业和是否大学毕业作为分组依据,统计每一组的wage均值
    

    在这里插入图片描述

    sysuse census
    tabulate region, gen(reg)
    //基于地区分组,对每个地区分别产生一个虚拟变量reg
    

    在这里插入图片描述
    在这里插入图片描述

    graph bar命令

    sysuse nlsw88.dta, clear
    graph hbar (mean) wage, over(industry) over(collgrad)
    //graph bar基于两个类别变量分组时,要用两个over
    

    在这里插入图片描述

    sysuse nlsw88.dta, clear
    graph hbar (mean) wage, over(industry) over(collgrad)  ///
    blabel(bar, position(outside))
    //注意:当使用“///”对一条过长的命令进行分行时,每一行末尾的“///”和该行最后的字母之间要有两个空格以上的距离
    

    在这里插入图片描述

    外部命令tabplot

    Description

    tabplot plots a table of numerical values (for example, frequencies, fractions, or percents) in graphical form as a bar chart.  It is mainly intended
    for representing contingency tables for one, two, or three categorical variables.  It also has uses for producing multiple histograms and graphs for
    general one-, two-, or three-way tables.
    
    tabplot industry collgrad
    

    在这里插入图片描述

    tabplot industry collgrad, horizontal
    

    在这里插入图片描述

    选项showval
    showval specifies that numeric values be shown beneath (or if horizontal is specified, to the left of) bars.

    tabplot, showval(offset(#)) 
    //specifies an offset between the base (or left-hand edge) of the bar 
    //and the position of the numeric value.  Default is 0.1
    //with two variables or 0.02 with one variable. 
    
    tabplot, percent()
    

    选项percent
    percent(varlist) indicates that all frequencies should be shown as percents (with sum 100) of the total frequency for each distinct category defined by the combinations of varlist. Usually, varlist will be one or more of the variables specified.

    tabplot industry collgrad, horizontal   ///
    percent(collgrad)  showval(offset(0.05))
    

    在这里插入图片描述

    2. 将连续变量转化为类别变量,继而分组统计/回归

    (1)group命令

    a. 分组

    sysuse nlsw88, clear
    sort wage
    gen g_wage = group(5)
    //将工资按大小排列后,等分为5组
    br wage g_wage
    tab g_wage
    //显示每一个工资档共有多少数据
    

    在这里插入图片描述

    在这里插入图片描述
    b. 为新生成的类别变量g_wage添加value labels
    复习:STATA学习笔记-变量-变量标签

    sysuse nlsw88, clear
    sort wage
    gen g_wage = group(5)
    br wage g_wage
    tab g_wage
    //为g_wage的1,2,3,4,5添加值标签
    //分两步走:
    //第一步:label define
    label define la_gwage 1 "low" 5 "high"
    //第二步:label values
    label values g_wage la_gwage
    
    

    在这里插入图片描述
    在这里插入图片描述

    c. 统计分析

    c.1 help tabstat

    tabstat命令

    sysuse auto,clear
    tabstat price weight mpg rep78
    //Show the mean (by default) of price, weight, mpg, and rep78
    

    在这里插入图片描述

    sysuse auto,clear
    tabstat price weight mpg rep78,by(foreign)
    //Show the mean (by default) of price, weight, mpg, and rep78 by categories of foreign
    

    在这里插入图片描述

    sysuse auto,clear
    tabstat price weight mpg rep78, by(foreign) stat(mean sd min max)
    //In addition to mean, show standard deviation, minimum, and maximum
    

    在这里插入图片描述

    c.2 tabstat,by(g_wage)

    sysuse nlsw88, clear
    sort wage
    gen g_wage = group(5)
    br wage g_wage
    tab g_wage
    //为g_wage的1,2,3,4,5添加值标签
    //分两步走:
    //第一步:label define
    label define la_gwage 1 "low" 5 "high"
    //第二步:label values
    label values g_wage la_gwage
    tabstat wage age married union collgrad south,by(g_wage)
    

    在这里插入图片描述

    (2)外部命令 quantiles分组

    Description

    quantiles creates a new variable (newvar) that categorizes varname by its quantiles. It differs from xtile because the categories are defined by the
    ideal size of the quantile rather than by the cutpoints, therefore yielding less unequaly sized categories when the cutpoint value is frequent, when
    using weights or when the number of observations in the dataset is not a product of the number of quantiles. It may not work properly on small
    datasets or if calculated for small groups. If the number of observations in the dataset or group is small, tabulate newvar afterwards to check the
    results.
    
    quantiles "var", gen "new_varname"
    //gencatvar(newvar) specifies the new variable to be generated
    
    quantiles var,nquant()
    // specifies the number of quantiles; # must be an integer and greater than or equal to 2. If not specified default is 10 quantiles
    
    bysort industry: quantiles wage, gen(p_wage) nq(3) 
    //按行业分组之后,把每个行业内部的wage按33th,66th分成3组
    //每一个行业对应一个类别变量p_wage,有三个值:1,2,3
    

    在这里插入图片描述

    3.分组回归

    sysuse nlsw88, clear
    sort wage
    gen g_wage = group(5)
    br wage g_wage
    tab g_wage
    //为g_wage的1,2,3,4,5添加值标签
    //分两步走:
    //第一步:label define
    label define la_gwage 1 "low" 5 "high"
    //第二步:label values
    label values g_wage la_gwage
    tabstat wage age married union collgrad south,by(g_wage)
    
    local x "age ttl_exp married union collgrad south c_city"
    //对g_wage=1的数据进行回归
    reg wage `x'  if g_wage == 1,robust
    est store Low
    //对g_wage=3的数据进行回归
    reg wage `x' if g_wage == 3,robust
    est store Mid
    //对g_wage=5的数据进行回归
    reg wage `x' if g_wage == 5,robust
    est store High
    //对所有数据统一进行回归
    reg wage `x',robust
    est store Full
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    local m "Low Mid High Full"
    esttab `m'
    

    在这里插入图片描述

    local m "Low Mid High Full"
    esttab `m',mtitle(`m')
    //将定义的low mid high full作为表格第一行列名
    

    在这里插入图片描述

    展开全文
  • DataGridVIew分组+合计+筛选
  • C#类似于QQ分组

    2013-03-13 12:59:34
    类似于QQ分组
  • android通讯录分组管理

    热门讨论 2012-10-15 10:44:00
    这是类似于QQ分组的一个android通讯录分组管理,并点击个人可以编写该人信息,还可以搜索好友,是个很不错的例子
  • Stream流-分组操作

    千次阅读 多人点赞 2020-07-11 22:21:05
    Stream流-分组操作 文章目录Stream流-分组操作方法1,`groupingBy(Function)`方法2,`groupingBy(Function,Collector)`方法3:`groupingBy(Function,Supplier,Collector)` Collectors.groupingBy()3个方法的使用...

    Stream流-分组操作

    Collectors.groupingBy()3个方法的使用示例

    /**员工
     * @author Yang
     * @create 2020-07-09 19:57
     */
    public class Employee {
        
        private String name;   // 姓
        private String city;   // 城市
        private Integer sales;  // 销售额
    
        public Employee(String name, String city, Integer sales) {
            this.name = name;
            this.city = city;
            this.sales = sales;
        }
    
        public Employee(String city, Integer sales) {
            this.city = city;
            this.sales = sales;
        }
    
        public Employee() {
        }
    
        // getter(),setter() ....略
        
        @Override
        public String toString() {
            return "Employee{" +
                    "name='" + name + '\'' +
                    ", city='" + city + '\'' +
                    ", sales=" + sales +
                    '}';
        }
    }
    
        //-------------------生成测试数据---------------------
        private List<Employee> getEmps(){
            List<Employee> list = new ArrayList<>();
            Random rd = new Random();
            String[] citys = {"北京","上海","广州","杭州","深圳"};
            String[] firstName = {"张","李","杨","宁","刘","王","高","葛"};
            Integer[] sales = {100,50,30,20};
    
            for (int i = 0; i < 10; i++) {
                String city = citys[rd.nextInt(5)];
                Integer sale = sales[rd.nextInt(4)];
                String fname = firstName[rd.nextInt(firstName.length)];
    
                list.add(new Employee(fname,city,sale));
            }
    
            return list;
        }
    

    方法1-- groupingBy(Function)

    一个参数:一个分组器,使用提供的字段对集合元素进行分组,返回一个Map<字段,相同字段值的元素集>

        /**
         *  groupBy方法1,groupingBy(Function)
         *
         *  要求:先按city分组,每个分组里面是一个员工集合
         */
        @Test
        public void test5(){
            List<Employee> emps = getEmps();
    
            Map<String, List<Employee>> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity));
    
            map.forEach((key,val)->{
                System.out.println("城市:"+key+" ---员工集: "+val);
            });
        }
        /**
         * 城市:广州 ---员工集: [Employee{name='1', city='广州', sales=100}, Employee{name='5', city='广州', sales=20}, Employee{name='6', city='广州', sales=30}, Employee{name='8', city='广州', sales=30}]
         * 城市:上海 ---员工集: [Employee{name='0', city='上海', sales=30}]
         * 城市:杭州 ---员工集: [Employee{name='2', city='杭州', sales=50}, Employee{name='7', city='杭州', sales=30}]
         * 城市:北京 ---员工集: [Employee{name='3', city='北京', sales=30}, Employee{name='4', city='北京', sales=50}, Employee{name='9', city='北京', sales=30}]
         */
    

    方法2-- groupingBy(Function,Collector)

    2个参数:一个是分组器,按提供的字段进行分组。一个收集器,下面举例了3种用途

        /**
         *  groupBy方法2,groupingBy(Function,Collector)
         *
         *  要求:先按city分组 ,再对组里面的成员,统计总销售额
         */
        @Test
        public void test3(){
            List<Employee> emps = getEmps();
            for (Employee emp : emps) {
                System.out.println(emp);
            }
    
            Map<String, Integer> map = emps.stream().
                    collect(Collectors.groupingBy(Employee::getCity, Collectors.summingInt(Employee::getSales)));
            //                                    先按city分组                                  再对组里面的成员,统计总销售额
            map.forEach((key,val)->{
                System.out.println("城市:"+key+" 销售总额:"+val);
            });
        }
        /**
         * Employee{name='0', city='上海', sales=50}
         * Employee{name='1', city='广州', sales=20}
         * Employee{name='2', city='广州', sales=30}
         * Employee{name='3', city='广州', sales=20}
         * Employee{name='4', city='杭州', sales=30}
         * Employee{name='5', city='杭州', sales=50}
         * Employee{name='6', city='北京', sales=50}
         * Employee{name='7', city='广州', sales=20}
         * Employee{name='8', city='杭州', sales=100}
         * Employee{name='9', city='广州', sales=30}
         * 城市:广州 销售总额:120
         * 城市:上海 销售总额:50
         * 城市:杭州 销售总额:180
         * 城市:北京 销售总额:50
         */
    
        /**
         * groupBy方法2,groupingBy(Function,Collector)
         *
         * 即:获取每个城市的姓氏集
         * 先按城市分组,再对每个组里面的员工姓名放入Set,得到每个城市的姓氏集
         */
        @Test
        public void test4(){
            List<Employee> emps = getEmps();
            Map<String, Set<String>> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toSet())));
            map.forEach((key,val)->{
                System.out.println(""+key+" ---人员姓名: "+val);
            });
        }
        /**
         * 上海 ---人员姓名: [葛]
         * 广州 ---人员姓名: [张, 刘, 王]
         * 杭州 ---人员姓名: [杨, 刘, 葛]
         */
    
        /**
         * groupBy方法2,groupingBy(Function,Collector)
         * 要求:每个城市中销售额最大的员工
         *      先按城市分组,在求分组里面销售额最大的员工
         */
        @Test
        public void test6(){
            List<Employee> emps = getEmps();
            
            Map<String, Employee> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity,
                    Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Employee::getSales)), Optional::get)));
    
            map.forEach((key,val)->{
                System.out.println("城市:"+key+" 销售额最大员工:"+val);
            });
        }
       /**
         * Employee{name='杨', city='北京', sales=100}
         * Employee{name='杨', city='杭州', sales=20}
         * Employee{name='葛', city='深圳', sales=30}
         * Employee{name='张', city='上海', sales=50}
         * Employee{name='杨', city='广州', sales=50}
         * Employee{name='张', city='上海', sales=20}
         * Employee{name='张', city='上海', sales=50}
         * Employee{name='刘', city='北京', sales=50}
         * Employee{name='高', city='深圳', sales=100}
         * Employee{name='葛', city='深圳', sales=30}
         * 城市:广州 销售额最大员工:Employee{name='杨', city='广州', sales=50}
         * 城市:上海 销售额最大员工:Employee{name='张', city='上海', sales=50}
         * 城市:杭州 销售额最大员工:Employee{name='杨', city='杭州', sales=20}
         * 城市:深圳 销售额最大员工:Employee{name='高', city='深圳', sales=100}
         * 城市:北京 销售额最大员工:Employee{name='杨', city='北京', sales=100}
         */
    

    方法3-- groupingBy(Function,Supplier,Collector)

    参数:一个分组器,一个最终类型的生产者,一个收集器

    下面的示例:先按城市分组,然后收集每个城市的姓氏集,然后放入一个TreeMap,得到最终结果。(按城市名称排了序

       /**
         * 3个参数的方法:groupingBy(Function,Supplier,Collector)
         * 要求:要计算每个城市中人的姓氏集,并对城市名称进行排序
         * 先按城市分组,在对每个城市
         */
        @Test
        public void test7(){
            List<Employee> emps = getEmps();
            TreeMap<String, Set<String>> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity, TreeMap::new, Collectors.mapping(Employee::getName, Collectors.toSet())));
            map.forEach((key,val)->{
                System.out.println("城市:"+key+" 姓氏集:"+val);
            });
        }
        /**
         * 城市:上海 姓氏集:[刘]
         * 城市:北京 姓氏集:[宁, 李]
         * 城市:广州 姓氏集:[张, 高, 葛]
         * 城市:杭州 姓氏集:[张, 高, 葛]
         */
    
    展开全文
  • R语言ggplot2绘制分组箱型图和分组柱状图

    万次阅读 多人点赞 2020-07-23 16:43:03
    论文中常见的分组箱型图和分组条形图可以直观的比较方法的效果,以一个图显示多个方法在多个数据集上的AUC或AUPR,包含2个分类变量和1个连续变量。 分组条形图 数据 分组箱型图 ...
  • Android GridView 多标题分组显示,上下拉刷新,convertview可重用 效率高,不卡
  • 数据分组 分组统计 - groupby功能 ① 根据某些条件将数据拆分成组 ② 对每个组独立应用函数 ③ 将结果合并到一个数据结构中 Dataframe在行(axis=0)或列(axis=1)上进行分组,将一个函数应用到各个分组并产生一...
  • Mybatis:动态SQL分组查询

    千次阅读 2020-08-19 14:27:41
    利用Mybatis 动态SQL 拼装Group By 语句,实现单个和多个字段分组 2. 代码实现 2.1 mapper <!--分组查询证书信息列表--> <resultMap id="groupResultMap" type="java.util.Map"> <result ...
  • android关于listview之列表分组

    热门讨论 2012-09-29 15:11:26
    android关于listview之列表分组,像Q上一样显示列表项
  • java正则表达式分组( )分组

    千次阅读 2018-11-12 14:32:10
     在java正则表达式中,( )是分组的意思,依旧是所谓的捕获组。每一个( )代表着一个group,该组是通过从左至右计算其括号来编号。 一个经典的例子: 在表达式((A)(B(C))),有四个这样的组: ((A)(B...
  • 分组卷积

    千次阅读 2020-05-09 19:52:20
    Pytorch的分组卷积 新代小新 2019-09-18 16:40:17 488 收藏 1 展开 最近使用pytorch的时候遇到nn.Conv2d和F.conv2d中的groups参数设置问题,查阅了一些相关资料发现网上的回答并不是很清晰明朗,所以自己写一篇关于...
  • 微软rdlc报表创建、设置数据、设置分组分组统计,有截图,有代码段。形象、简单、明了
  • DataTables行分组的展开与折叠功能的实现
  • Java正则表达式之分组和替换

    万次阅读 多人点赞 2019-08-24 08:36:17
    正则表达式的分组不是很好懂,但却是很强大的文本处理工具。 1 分组替换 什么是分组,直接引用 Java Api 中 Pattern 中的描述: Capturing groups are numbered by counting their opening parentheses from ...
  • jqgrid 分组 合计 例子

    热门讨论 2012-04-21 17:08:07
    利用jquery的插件jqgrid实现表头合并、分组、合计、例子
  • 仿虎扑,带悬浮标题的PinnedSectionListView,不帶下拉刷新的Demo,实现时间按照日期和时分秒进行分类
  • 分组密码及五种工作模式、DES和AES

    千次阅读 2020-03-24 08:27:37
    Feidtel加密和解密(16轮): Feistel结构的具体实现依赖于以下参数和特征 分组长度:分组长度越长意味着安全性越高,但会降低加、解密的速度,这种安全性的增加来自更好的扩散性(传统上,64位的长度比较合理,在...
  • R语言分组求和,分组求平均值,分组计数

    万次阅读 多人点赞 2021-02-20 14:50:17
    我们经常可能需要把一个数据按照某一属性分组,然后计算一些统计值。在R语言里面,aggregate函数就可以办到。 ## S3 method for class 'data.frame' aggregate(x, by, FUN, ..., simplify = TRUE, drop = TRUE) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 814,519
精华内容 325,807
关键字:

分组