用R处理一组数据的三种方式
USArrests是R附带的一个数据集,现在我们需要创建一个factor向量urbancat,如果UrbanPop列的某个值在中位数之上,就把urbancat对应位置的值设为1,否则设为0。
这种数据处理任务实在太简单了,一个for循环就能搞定。首先,我们计算一下UrbanPop的中位数:
urbanPop.median <- median(USArrests$UrbanPop)
然后,用rep函数初始化一个等长的urbancat向量:
urbancat <- rep(x = 0, times = length(USArrests$UrbanPop))
接着,用for循环为urbancat设置对应位置的值:
for (i in 1:length(urbancat)) {
if (USArrests$UrbanPop[i] > urbanPop.median) {
urbancat[i] <- 1
}
}
以上代码对于拥有命令式编程背景的同学来说是非常亲切自然的。值的提醒的是,如果urbancat的长度有可能为0,那么使用1:length(urbancat)可能会有非预期结果(你可以试一下),这个时候我们建议把1:length(urbancat)换成seq_along(urbancat)。
对于拥有函数式编程背景的同学,可以使用purrr的map函数:
library(purrr)
urbancat <- map_dbl(USArrests$UrbanPop, function(x) if (x > urbanPop.median) 1 else 0)
map_dbl会在应用你传入的匿名函数之后以double向量的方式返回结果。如果你喜欢用formula,也可以把匿名函数换成formula:
urbancat <- map_dbl(USArrests$UrbanPop, ~ if (.x > urbanPop.median) 1 else 0)
这里的.x表示map_dbl传给你的UrbanPop列的某个值。
在接触R之前,我基本上都会选择FP的做法,但在接触R之后,我被它的向量化运算以及通过逻辑值取子集(logical subsetting)的做法深深吸引:
urbancat[USArrests$UrbanPop > urbanPop.median] <- 1
USArrests$UrbanPop是一个向量,而urbanPop.median是一个值,因为R默认支持向量化运算,所以拿USArrests$UrbanPop和urbanPop.median比较会自动转化成拿USArrests$UrbanPop里的每个值和urbanPop.median,得到一个和USArrests$UrbanPop等长的由逻辑值(T和F)组成的向量(F F T F T ......)。当我们用这个逻辑值向量去索引urbancat时,就会取出逻辑值为T的对应元素,这个时候,结合赋值运算就可以把这些元素都设为1了。
最后,要把urbancat变成factor向量,你可以修改for循环或者map函数,但在R里,你只需把urbancat传给factor函数就行了:
urbancat <- factor(urbancat)
Ruby之父松本行弘在他的《松本行弘的程序世界》里说过,“在语言学领域里,有一个Sapir-Whirf假说,认为语言可以影响说话者的思想。也就是说,语言的不同,造成了思想的不同。程序员由于使用的编程语言不同,他的思考方法和编写出来的代码都会受到编程语言的很大影响。”而这番话可以很好地概括我此时的感受。
用R处理一组数据的三种方式的更多相关文章
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- ios网络学习------4 UIWebView的加载本地数据的三种方式
ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...
- Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式
Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式 P703 Linux读写内存数据的三种方式 1.read ,write方式会在用户空间和内核空间不断拷贝数据, ...
- MATLAB 显示输出数据的三种方式
MATLAB 显示输出数据的三种方式 ,转载 https://blog.csdn.net/qq_35318838/article/details/78780412 1.改变数据格式 当数据重复再命令行 ...
- ajax数据提交数据的三种方式和jquery的事件委托
ajax数据提交数据的三种方式 1.只是字符串或数字 $.ajax({ url: 'http//www.baidu.com', type: 'GET/POST', data: {'k1':'v1'}, ...
- Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)
一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- iOS --- UIWebView的加载本地数据的三种方式
UIWebView是IOS内置的浏览器,可以浏览网页,打开文档 html/htm pdf docx txt等格式的文件. safari浏览器就是通过UIWebView做的. 服务器将MIM ...
- android sqlite使用之模糊查询数据库数据的三种方式
android应用开发中常常需要记录一下数据,而在查询的时候如何实现模糊查询呢?很少有文章来做这样的介绍,所以这里简单的介绍下三种sqlite的模糊查询方式,直接上代码把: package com.e ...
- jQuery中通过JSONP来跨域获取数据的三种方式
第一种方法是在ajax函数中设置dataType为'jsonp' $.ajax({ dataType: 'jsonp', url: 'http://www.a.com/user?id=123', su ...
随机推荐
- 使用Node.js+Hexo+Github搭建个人博客
一.为什么要花时间去搭建个人博客? 首先说说为什么我想要尝试着去搭建属于自己的Blog,古人云:“好记性不如烂笔头”.一开始我把笔记做在本子上.电脑上,发现要用的时候特别地不方便,而且越记越多.越多越 ...
- Docker动态给容器Container暴露端口
查看Container的IP地址 docker inspect <container name or id>| grep IPAddress 查看Container的映射的端口 docke ...
- spring security 学习一
1.配置基本的springboot web项目,加入security5依赖,启动项目 浏览器访问,即可出现一个默认的登录页面 2.什么都没有配置 登录页面哪里来的 一般不知从何入手,就看官方文档里是如 ...
- 微信小程序上的map组件bindregionchange地图视野变化函数成功回调会产生2次值的问题?
bindregionchange确实是会触发两次,第一次是视野变化开始,第二次是视野变化结束. 你可以尝试把e.type给打印出来,值为begin表示开始,值为end表示结束. wxml: js:
- .NET Core on K8S快速入门课程学习笔记
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 目录 01-介绍K8s是什么 02-为什么要学习k8s 03-如何学习k8s ...
- 利用阿里云搭建frp实现外网远程桌面链接内网电脑
主要应用场景:针对学生放假回家使用外网无法远程操作学校的服务器或者电脑,这里通过阿里云的云服务器搭建一个frp服务,实现内网穿透,从而可以直接通过远程桌面或者其他工具实现对校园网内的服务器或者电脑进行 ...
- 学习使人快乐7--Mail收发原理+计划
本篇了解邮件收发的原理与机制(smtp,pop3协议).不打算作重点学习辣~~~~~~~~~~~~~~~~ 日常感谢大佬gacl 另:打算把每周计划学的东西发在blog上面,勉励一下本咸鱼本周计划:1 ...
- BP神经网络综合评价法
BP神经网络综合评价法是一种交互式的评价方法,一种既能避免人为计取权重的不精确性, 又能避免相关系数求解的复杂性,还能对数量较大且指标更多的实例进行综合评价的方法,它可以根据用户期望的输出不断修改指标 ...
- flask权限控制
大概思路为通过管理员id的查询角色,然后查看相应权限,为列表类型,然后通过id查询对应的路由规则,进而得出结论得出是否具有该权限 具体代码: def admin_auth(f): @wraps(f) ...
- Xcode 10.1 运行老版本工程遇到问题解决记录
近来接手公司一个历史遗留项目进行修改.上线工作,想想我都近三年没敲过iOS代码了也是慌.. 项目大致情况: 18年年初应上线项目,各种情况下一直搁置,到18年底了要重启上线,原来开发人员离职了都,年底 ...