惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
美团技术团队
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
有赞技术团队
有赞技术团队
GbyAI
GbyAI
宝玉的分享
宝玉的分享
腾讯CDC
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
月光博客
月光博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog

博客园 - Allen Lee

遇见C++ AMP:GPU的线程模型和内存模型 遇见C++ AMP:在GPU上做并行计算 遇见C++ PPL:C++ 的并行和异步 遇见C++ Lambda WP7有约(八):在ListPicker控件的选择页面上播放铃声 WP7有约(七):实现铃声设置的播放图标的效果 WP7有约(六):AppBarUtils使用指南 WP7有约:一个应用的破蛋过程 WP7有约(五):回到主页 WP7有约(四):课程全景 WP7有约(三):课堂重点 WP7有约(二):课后作业 WP7有约(一):课程安排 Ruby 101:行为驱动 Ruby 101:动态编程 Ruby 101:方法对象 Ruby 101:对象和方法 Ruby 101:重用、隐藏和多态 - Allen Lee Ruby 101:类和对象
用R处理一组数据的三种方式
Allen Lee · 2018-06-24 · via 博客园 - Allen Lee

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