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

推荐订阅源

The GitHub Blog
The GitHub Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
O
OpenAI News
I
InfoQ
S
SegmentFault 最新的问题
Help Net Security
Help Net Security
Latest news
Latest news
V2EX - 技术
V2EX - 技术
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
Google Online Security Blog
Google Online Security Blog
The Cloudflare Blog
罗磊的独立博客
The Register - Security
The Register - Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
The Hacker News
The Hacker News
人人都是产品经理
人人都是产品经理
月光博客
月光博客
博客园 - Franky
V
Vulnerabilities – Threatpost
SecWiki News
SecWiki News
Attack and Defense Labs
Attack and Defense Labs
T
Tenable Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MyScale Blog
MyScale Blog
C
CERT Recently Published Vulnerability Notes
Recent Announcements
Recent Announcements
博客园 - 【当耐特】
Y
Y Combinator Blog
C
Cisco Blogs
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
H
Hacker News: Front Page
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
I
Intezer
C
Cybersecurity and Infrastructure Security Agency CISA
aimingoo的专栏
aimingoo的专栏
A
Arctic Wolf
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org

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