这看起来像是一个问题应该在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
族函数来修改滤出数据集中的值(从而避免对函数本身进行矢量化),最后根据它们将它们填充回原始数据框中到“坐标”。
非常感谢这种想法的实施。