zoukankan      html  css  js  c++  java
  • 用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假说,认为语言可以影响说话者的思想。也就是说,语言的不同,造成了思想的不同。程序员由于使用的编程语言不同,他的思考方法和编写出来的代码都会受到编程语言的很大影响。”而这番话可以很好地概括我此时的感受。

  • 相关阅读:
    抽象类
    继承
    面向对象的静态属性,类方法,静态方法
    查找linux系统下的端口被占用进程的两种方法 【转】
    awk学习
    【转】借助LVS+Keepalived实现负载均衡
    ORA-28001: the password has expired解决方法
    ORACLE的还原表空间UNDO写满磁盘空间,解决该问题的具体步骤
    Oracle控制文件多路复用以及Oracle备份重建控制文件
    RedHat6.1通过配置yum server安装软件包
  • 原文地址:https://www.cnblogs.com/allenlooplee/p/9222173.html
Copyright © 2011-2022 走看看