【问题标题】:Change values in multiple columns of a dataframe using a lookup table使用查找表更改数据框多列中的值
【发布时间】:2015-07-26 03:18:24
【问题描述】:

我正在尝试使用查找表一次更改多个列的值。它们都使用相同的查找表。我知道如何只为一列执行此操作——我只使用merge,但在处理多列时遇到了问题。

以下是示例数据框和示例查找表。我的实际数据要大得多(约 10K 列,8 行)。

example <- data.frame(a = seq(1,5), b = seq(5,1), c=c(1,4,3,2,5))

lookup <- data.frame(number = seq(1,5), letter = LETTERS[seq(1,5)])

理想情况下,我最终会得到一个如下所示的数据框:

example_of_ideal_output <- data.frame(a = LETTERS[seq(1,5)], b = LETTERS[seq(5,1)], c=LETTERS[c(1,4,3,2,5)])

当然,在我的实际数据中,数据框是数字,但是查找表要复杂得多,所以我不能只使用LETTERS这样的函数来解决问题。

提前谢谢你!

【问题讨论】:

    标签: r merge multiple-columns lookup lookup-tables


    【解决方案1】:

    这是一个使用lapply() 依次作用于每一列的解决方案:

    as.data.frame(lapply(example,function(col) lookup$letter[match(col,lookup$number)]));
    ##   a b c
    ## 1 A E A
    ## 2 B D D
    ## 3 C C C
    ## 4 D B B
    ## 5 E A E
    

    或者,如果您不介意切换到矩阵,则可以实现“更加矢量化”的解决方案,因为矩阵将允许您为整个输入调用一次 match() 和索引 lookup$letter

    matrix(lookup$letter[match(as.matrix(example),lookup$number)],nrow(example));
    ##      [,1] [,2] [,3]
    ## [1,] "A"  "E"  "A"
    ## [2,] "B"  "D"  "D"
    ## [3,] "C"  "C"  "C"
    ## [4,] "D"  "B"  "B"
    ## [5,] "E"  "A"  "E"
    

    (当然,之后您可以通过as.data.frame() 强制返回data.frame,尽管如果需要,您还必须恢复列名,这可以通过setNames(...,names(example)) 完成。但如果您真的想坚持使用 data.frame,我的第一个解决方案可能更可取。)

    【讨论】:

    • 这太好了,谢谢 - 特别感谢矢量化版本
    【解决方案2】:

    使用dplyr

    f <- function(x)setNames(lookup$letter, lookup$number)[x] 
    library(dplyr)
    example %>% 
      mutate_each(funs(f))
    #  a b c
    #1 A E A
    #2 B D D
    #3 C C C
    #4 D B B
    #5 E A E
    

    data.table

    library(data.table)
    setDT(example)[, lapply(.SD, f), ]
    #   a b c
    #1: A E A
    #2: B D D
    #3: C C C
    #4: D B B
    #5: E A E
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-29
      • 2021-01-26
      • 1970-01-01
      • 2022-08-14
      • 2018-01-01
      • 2022-01-10
      • 2020-04-07
      相关资源
      最近更新 更多