在做数据集的特征映射,数据集里有着许多字符变量,看到同事用pandas定义好字典后一行代码就直接将数据集里的字符变量映射成需要的数字变量。忽然想到之前我用R处理时,只能用replace写好长的循环或者ifelse,不知道有没有和pandas里的replace一样方便的函数,可以实现给定对照原则自动全部替换的功能。
R里有像pandas里的replace函数一样功能的函数吗?
能有字典的话相当于factor的levels有了?那么先factor一下然后as.numeric就行了?
我不太理解,和case_when
或者inner_join
有什么不同吗
规模比较大时,通过两表关联的方式比较好。
curiosity 看到同事用pandas定义好字典后一行代码就直接将数据集里的字符变量映射成需要的数字变量
如果我理解对了你的问题的话,那么你需要的不是任何函数,你只需要两个字符,就是一对方括号(当然,要较真的话,方括号也是函数——Lisp 万岁万万岁):
dict = c('a' = 3, 'b' = 1, 'c' = 4) # 字典
chars = c('a', 'b', 'c', 'a', 'a', 'a', 'c', 'd', 'e') # 字符变量
dict[chars]
a b c a a a c <NA> <NA>
3 1 4 3 3 3 4 NA NA
完事。
方括号索引似乎是摆在 R 用户眼皮底下、最有用、但又最容易被忽略的一个功能。
yihui
诶我是无意间看到的vector的这个用法!然后当时正好在用Python写类似的东西,很自然地想到它可以实现字典字符串批量替换的功能。
不过好像很多教程都不会告诉大家vector的这个功能或者告诉了也不会指出它有这样的用处。
fenguoerbian 可能因为levels不能重复,同时levels因为都是按顺序来的,所以感觉用起来并不是很方便
curiosity 想重复可以再考虑加上factor
里面的labels
参数,想改顺序可以在前期准备这个“字典”的时候把idx也做进去。
试了一下,感觉两表关联的方法符合日常使用数据库的直观理解,操作起来更顺手。方括号的方法R味十足,确实有魅力,向量化简洁高效,就是确实不容易想到。factor也确实是一种可行的方法,需要前期稍作处理,但还是可以达到预期目标的。
SungManhin 不过好像很多教程都不会告诉大家vector的这个功能
可能是因为管道操作符让多数人都觉得代码写起来太优美了,操作数据一定是一根接一根的管道,让数据从一个函数流到另一个函数,所以我们忘了最基础的操作符;此事就像旧体格律诗看起来整齐,却会用形式束缚作者,而新诗和散文从形式上看起来没那么漂亮,却能让文字有更丰富的表达。
另一个可能得原因是教程会侧重以数据框为核心数据类型,数据框纵有它的千般好,但这种思维定式也可以把简单的事情复杂化。向量、矩阵、因子、列表、环境等等,各有各的巧妙玩法,了解一下还是好的,哪怕绝大多数时候还是跟数据框打交道。