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处理一组数据的三种方式的更多相关文章

  1. 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 ...

  2. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

  3. Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式

    Linux就这个范儿 第18章  这里也是鼓乐笙箫  Linux读写内存数据的三种方式 P703 Linux读写内存数据的三种方式 1.read  ,write方式会在用户空间和内核空间不断拷贝数据, ...

  4. MATLAB 显示输出数据的三种方式

    MATLAB 显示输出数据的三种方式 ,转载 https://blog.csdn.net/qq_35318838/article/details/78780412 1.改变数据格式 当数据重复再命令行 ...

  5. ajax数据提交数据的三种方式和jquery的事件委托

    ajax数据提交数据的三种方式 1.只是字符串或数字 $.ajax({ url: 'http//www.baidu.com', type: 'GET/POST', data: {'k1':'v1'}, ...

  6. Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)

    一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  7. iOS --- UIWebView的加载本地数据的三种方式

    UIWebView是IOS内置的浏览器,可以浏览网页,打开文档  html/htm  pdf   docx  txt等格式的文件.  safari浏览器就是通过UIWebView做的. 服务器将MIM ...

  8. android sqlite使用之模糊查询数据库数据的三种方式

    android应用开发中常常需要记录一下数据,而在查询的时候如何实现模糊查询呢?很少有文章来做这样的介绍,所以这里简单的介绍下三种sqlite的模糊查询方式,直接上代码把: package com.e ...

  9. jQuery中通过JSONP来跨域获取数据的三种方式

    第一种方法是在ajax函数中设置dataType为'jsonp' $.ajax({ dataType: 'jsonp', url: 'http://www.a.com/user?id=123', su ...

随机推荐

  1. PHP客服聊天

    1.基于workman框架 github:https://github.com/walkor/workerman-chat 文档:http://www.workerman.net/gatewaydoc ...

  2. ThinkPHP 2053错误

    这个报错是调用存储过程的时候产生的,用的是5.1的代码是根据官方文档写的,我怀疑5.0也有这个问题.去官方查了一下发现不少人有这个问题,但是官方都没有回应过,只能自己动手一步步调了. $center ...

  3. Robot Framework学习笔记

    robot framework 上个用例的输出作为下个用例的输入 (Set Global Variable的用法) 注意:如果直接在suite里定义变量,变量在suite里的用例里只能应用,修改的效果 ...

  4. java - day008 -final ,static ,访问控制符.

    面向对象   封装         类: 模板         对象: 实例         引用,遥控器         构造方法                新建对象时执行           ...

  5. Font Awesome,一套绝佳的图标字体库和CSS框架

    http://fontawesome.dashgame.com/ http://www.runoob.com/font-awesome/fontawesome-tutorial.html Font A ...

  6. 小米众筹新品---8H凉感慢回弹记忆绵枕 99元 上手开箱图

    在众目睽睽之下,商城终于成了杂货铺 众筹发布了第98期新品——8H凉感慢回弹记忆绵枕H1,售价为99元,主打舒适凉感,抗菌吸湿,三曲线护颈设计,3~5秒慢回弹. 本着程序员的读书历程:x 语言入门 — ...

  7. 出错:Error creating bean with name 'studentServiceImpl': Unsatisfied dependency expressed through field 'studentMapper';

    详细错误: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with nam ...

  8. 测开之路十:函数&参数

    def 函数名(): 函数代码块 return 返回值 参数 必备参数:位置参数,调用函数时必须有值传入 默认参数,调用如果没有传值使用默认值 不定长参数 *args:想传多少传多少,必须放在位置参数 ...

  9. Linux下创建共享文件夹

    1,查看ip 地址 ifconifg: 2,查看是否安装samba服务器,rpm -qa | grep samba: 3,如果有该服务器,启动 service smb start,否则进行安装 yum ...

  10. C#如何实现DataGridView单元格拖拽

    参考: http://www.cnblogs.com/michaelxu/archive/2009/09/27/1574905.html