如何替换数据框中列的一部分的值?

时间:2015-10-12 21:42:47

标签: r dataframe dplyr

这看起来像是一个问题应该在SO或者其他地方被问到但是我找不到它所以无论如何我都会问它。

我有一个csv文件,需要清理。我使用read_csv将其带入R.让我们称之为df

现在,列C存储人员或公司名称。大多数数据点都很好,但是由于一些不可想象的原因,它们中的一小部分没有被正确解码(在生成这个csv文件时)并且仍然以base64格式存储,如下所示:{{1} }。

然后我构建了一个解码它的函数:

[b64]5b+r5LmQ56aPMjAxMQ==[/b64]

由于MyDecode <- function(x) iconv(rawToChar(caTools::base64decode(x,"raw")), from="utf-8", to = "gb18030") 没有矢量化,因此base64decode没有矢量化,当我尝试将其插入MyDecode管道时,这就让我感到头痛。

首先,dplyr不起作用,因为虽然它返回整个修改过的mutate,但它需要df进行矢量化。

接下来,我想做MyDecode这样的事情,但后来我丢失了解码字符串的所有位置信息。

最后我去了df %>% select(C) %>% filter(grepl("^\\[b64", .[[1]])) %>% sapply(.[[1]], MyDecode)函数(尽管很不情愿)。我试过MyDecode但结果并不好。更重要的是,我发现尽管打印出警告,Vectorize(MyDecode)会将无效的base64字符串(在我的情况下是人和公司的实际名称)转换为某些垃圾,所以当它被送到{{ 1}}原始字符串被毁了。因此,为了对其进行矢量化,我必须花费更多的精力来编写单行核心函数来处理错误,这使我在这里提出这样的问题:是否有base64decode方法来修改一些通过数据帧中的非向量化函数的值,并返回整个修改过的数据帧? 通过说rawToChar方式,我的意思是不使用for循环一次遍历整个数据帧一个数据点。

我觉得R可能不是这类任务的最佳工具吗?如果是真的,那么也许其他一些包甚至基地R最适合它?或者甚至我对这个问题的看法都被误导了?

P.S。我希望在这里找到一个更一般的答案,因为虽然我手头的具体问题可能会以许多不同的方式被黑客攻击,例如找到实际矢量化的base64解码函数,或者只是在特定列R上使用for循环,但我相信,当类似的问题出现时,相同的黑客通常不起作用,或者变得丑陋和低效。

谢谢!

编辑:

我能想到的“理想”方法是这样的:你过滤掉你想要修改的数据框的部分,他们的“坐标”(行号,以某种方式携带,然后使用其中一个dplyr族函数来修改滤出数据集中的值(从而避免对函数本身进行矢量化),最后根据它们将它们填充回原始数据框中到“坐标”。

非常感谢这种想法的实施。

0 个答案:

没有答案