一个自动化数据筛选的问题的解决--基于R语言

这个问题和解决来自于我的工作中。这篇文章的重点是,它不是介绍 R 语言入门的文章,是面向问题的,所以我抱着你能够看懂文中出现的代码的希望来写,代码又少又简单。

问题的描述是这样的,给定一个数据框,对于数据框中的字符型变量 A, 对任意组合的条件,产生新的数据框。

简单来说这里说描述的问题就是你几乎每天都在使用的Excel表格中的变量筛选所解决的问题。为了逻辑连贯,我在这里应该说明解决这个问题的意义。出于简洁的目的,我认为读者知道这个意义,而不再列举。我还是很乐意简单地说,为了自动化。我还没用发现一个r包可以解决这个问题,subset 函数是不行的,在后面会讨论到,如果有读者发现有某个函数已经解决了这个问题,欢迎告诉我。任意基于何冯·诺依曼的计算机自动化的充分条件是一段程序。所以我们需要一段代码来实现自动。从面向对象编程的观点来说,就是为数据框类定义一个方法,它的参数是一个序列,返回值是一个数据框对象。从函数是一个黑盒子的观点来看,subset 函数不可用的原因是它的 subset 参数不是向量,而是标量。当不确定有多少个标量时,我们不知道如何写和 subset 有关的代码。

一个实例

给定数据框 df, df中一个变量A,其中A={a, b, c},给定一个序列A~={a,c},返回一个以A~为变量的新数据框 df~。

使用过R的小伙伴都知道,应该使用subset函数.

subset(df, subset = (df$A == a | df$A == c), select = c(A, B))

让人感觉良好的是,它解决了给出的那个实例。生活总是给我教训,在我每当感觉良好的时候。

但是如果给定的序列为{b, c},你不得不在代码中修改,如果对每一种情况改一次代码,那么注定与自动化说拜拜了。从定义来说使用 subset 并不能写出一个算法,算法的定义要求算法应该能解决一类问题(我认为求一组任意个数整数的最大值是一个整数最大值算法,而只能求几个,不管多少个都不能看作算法)。subset函数是行不通的,因为使用subset对问题的泛化无能为力。

如果有一个解(算法),对于给定数据框 Q, 不乏一般性地,假设Q只有A, B两个观测(变量),其中观测A有x1,x2,...,xn个水平,对于k个来自观测A的水平的所组成的向量C={xi1,xi2,...xik},k<=n,能产生新由C和筛选出来的B组成新的数据框P。

连贯的逻辑下,写到这里我应该证明我的代码对上面这个模型总能得到想要的输出。我觉得这种工作应该留给数学家或者计算机专家,但我还是很乐意去尝试。首先给出伪代码:

zero <- FALSE;
x <- FALSE;
if k = 1
    x <- Q$A == C[1] | zero;
else
    i from 2 to k
       x <- Q$A == C[i] | x;
C=Q[which(x), ];
// 可以化简为
x <- FALSE;
i from 1 to k
    x <- Q$A == C[i] | x;
C = Q[which(x), ]

证明:
对于简化后的代码,第一行到第三行都属于一个循环体,第4行代码必定正确,因为是使用别人的函数。所以只证明循环部分是正确的。
假设:Q$A为整数,且已经排列。C已排列。计算环境中所有的量都是向量。
初始化:x<-FALSE,算法刷选了0个,把选择0个作为一个退化,显然满足我们的预期(它没有选择不该选择的行,所以是正确地)。
保持:如果进行到第i次之前,那么循环前x=(T,T,...F,F,...)是我们希望的,有i-1个TRUE,循环后x<-x|(F,F,...,T,F,F,...)=(T,T,...,F,F,...),有i个TRUE也是我们希望的,所以这里有个循环不变式。
总止:当i=k+1,循环终止,因为前k个都为T,如果令k=n,则它把整个Q选出来,显然是正确地。

下面是我在工作中使用的代码,它很少很简单,只有有三个语句。

hand <- FALSE
for (i in 1 : length(carrierNameList)) {
hand <- as.character(rate$Carrier) ==     getCode(carrierNameList[i]) | hand
}
rate <- rate[which(hand), ]

carrierNameList是一个序列(向量),rate是一个数据框,getCode是一个函数,它负责把carrierNameList转化为可以和rate中的Carrier变量匹配的序列。它总能对任意的carrierNameList(唯一的条件是每个元素经过getCode转化后为rate的carrier变量的一个水平)从rate中选择出所有的记录(行),然后产生新的数据框。你只需要把getCode函数拿掉,换成你的数据,就能解决你的数据面临的同样问题。唯一的不美的地方是它不是一函数的形式(它在逻辑上已经是一个函数了),有志的小伙伴可以试着把它写成一个 R 包。

其中的思想是,使用一个当前向量(伦家还没想好名字)去记录数据框中检查变量对匹配序列情况。首先匹配序列的每个元素和数据框的检验变量进行“==”运算,把这个结果称为判断向量,遍历序列后产生一个判断矩阵。然后对判断向量进行这样的求并:第一个判断向量与逻辑零向量(全为FALSE的逻辑向量)的并为当前向量,如果还有未进行并操作的判断向量,把当前向量与下一个判断向量的并为当前向量(类似于求和算法)。当不剩下未进行并操作的判断向量是,匹配的信息就凝结在当前向量上。最后,按当前向量中为真的下标去选取行。

祝小伙伴们在处理数据的工作上能顺心如意。有错误的地方欢迎提出来。

这里是分割线


从这里更新。
subset函数是行得通的。任何我能想到的一定有人比我前想到了,前面写的东西一无是处。
subset函数的第二个参数是一个二值的(逻辑)向量实例,只要找到满足条件的二值向量,就可以使用subset函数。为了找到这样的向量,使用的工具是正则表达式。

grepl('[a-z]', letters)
# 一个24个TRUE的向量
数据框#.png

数据框#~.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 首页 资讯 文章 资源 小组 相亲 登录 注册 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他...
    Helen_Cat阅读 3,781评论 1 10
  • 搬运自牛客网大神总结 extern关键字 extern修饰变量是个声明,此变量/函数是在别处定义的,要在此处引用 ...
    leon4ever阅读 3,583评论 0 9
  • 先自我描述一下 ,我很瘦,瘦到什么程度呢,上个月我小外甥办满月酒,一圈抱下来,我妈很满意地跟我说:“不错,终于有个...
    乙事诸阅读 140评论 0 1
  • “从今天起,本宫终于解放了”!接到小梦的电话,我在十公里外都能听出她的神采飞扬。小梦的婆婆在离她两公里外的小区...
    _青春不散场阅读 585评论 0 0
  • 有种五六年前残存着的非主流的味道 你摘下黄色枫叶 证明我在秋天离开 我答应你会回来 谁都知道是不会回来的 所以 找...
    Freakyboy阅读 472评论 1 4