在做数据集的特征映射,数据集里有着许多字符变量,看到同事用pandas定义好字典后一行代码就直接将数据集里的字符变量映射成需要的数字变量。忽然想到之前我用R处理时,只能用replace写好长的循环或者ifelse,不知道有没有和pandas里的replace一样方便的函数,可以实现给定对照原则自动全部替换的功能。

    能有字典的话相当于factor的levels有了?那么先factor一下然后as.numeric就行了?

      我不太理解,和case_when或者inner_join有什么不同吗

        规模比较大时,通过两表关联的方式比较好。

        curiosity 忽然想到之前我用R处理时,只能用replace写好长的循环或者ifelse

        应该不至于吧。在要替换的不同字符数不多时,可以用 replace 函数来做,比如下面将 NA 替换为 0

        replace(x = c(NA, 1,2,NA), list = c(1,4), values = 0)

          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的这个功能🤔或者告诉了也不会指出它有这样的用处。

              vickkk 嗯嗯,我学习一下,dplyr的函数掌握的还是不熟练啊,case_when感觉手写这么多规则还是有点麻烦的,因为字符的量还是蛮多的,inner_join确实是一个好方法。

              curiosity 想重复可以再考虑加上factor里面的labels参数,想改顺序可以在前期准备这个“字典”的时候把idx也做进去。

              yihui 哇,这个完全是一个新思路,我确实从来没有想过方括号索引这个功能,我也第一次知道vector可以这样用啊

              Cloud2016 数据量小时还行,数据量大时,replace要求的index就会变得非常复杂

              试了一下,感觉两表关联的方法符合日常使用数据库的直观理解,操作起来更顺手。方括号的方法R味十足,确实有魅力,向量化简洁高效,就是确实不容易想到。factor也确实是一种可行的方法,需要前期稍作处理,但还是可以达到预期目标的。

              SungManhin 不过好像很多教程都不会告诉大家vector的这个功能

              可能是因为管道操作符让多数人都觉得代码写起来太优美了,操作数据一定是一根接一根的管道,让数据从一个函数流到另一个函数,所以我们忘了最基础的操作符;此事就像旧体格律诗看起来整齐,却会用形式束缚作者,而新诗和散文从形式上看起来没那么漂亮,却能让文字有更丰富的表达。

              另一个可能得原因是教程会侧重以数据框为核心数据类型,数据框纵有它的千般好,但这种思维定式也可以把简单的事情复杂化。向量、矩阵、因子、列表、环境等等,各有各的巧妙玩法,了解一下还是好的,哪怕绝大多数时候还是跟数据框打交道。