【问题标题】:missing argument when using lapply in R在 R 中使用 lapply 时缺少参数
【发布时间】:2019-04-23 20:47:24
【问题描述】:

我有以下数据框:

set.seed(1)
df <- data.frame(X1 = sample(c(letters[1:5],NA),10,replace=TRUE),
                X2 = sample(c(letters[1:5],NA),10,replace=TRUE),
                X3 = sample(c(letters[1:5],NA),10,replace=TRUE),
                stringsAsFactors = FALSE)
     X1   X2   X3
1     b    b <NA>
2     c    b    b
3     d    e    d
4  <NA>    c    a
5     b    e    b
6  <NA>    c    c
7  <NA>    e    a
8     d <NA>    c
9     d    c <NA>
10    a    e    c

我想将 a 替换为 5,b 替换为 4,c 替换为 3,d 替换为 2,e 替换为 1,分别为:

df %>% lapply(., plyr::mapvalues(, c("a","b","c","d","e"), c(5,4,3,2,1)))

但它不起作用:我收到一条警告说它缺少函数 mapvalues() 的第一个参数。 有谁知道我做错了什么?

【问题讨论】:

    标签: r dataframe apply lapply data-manipulation


    【解决方案1】:

    简单而直接的方法:

    lookup <- 5:1
    names(lookup) <- c("a","b","c","d","e")
    
    df[] <- lapply(df, function(x) lookup[x])
    df
       X1 X2 X3
    1   4  4 NA
    2   3  4  4
    3   2  1  2
    4  NA  3  5
    5   4  1  4
    6  NA  3  3
    7  NA  1  5
    8   2 NA  3
    9   2  3 NA
    10  5  1  3
    

    注意lookup是一个简单的命名向量,即

    > lookup
    a b c d e 
    5 4 3 2 1 
    

    并且df[] 确保您在lapply 上时保留数据帧结构。在对lapply 的调用中,每列中的值仅用于在查找表中按名称进行查找。为了突出这一点,lookup["c"] 返回值“3”。

    【讨论】:

      【解决方案2】:

      使用lapply 的语法略有不同。以下是它的工作原理:

      df %>% lapply(plyr::mapvalues, from = c("a","b","c","d","e"), to = c(5,4,3,2,1))
          $X1
       [1] "1" "3" "3" "1" "1" "2" "4" "5" NA  "2"
      
      $X2
       [1] "2" "1" NA  "3" "1" "5" "3" "2" NA  NA 
      
      $X3
       [1] "3" "3" NA  "1" NA  "1" "1" "2" NA  "2"
      

      如果您之后仍想拥有一个数据框,最好使用apply 而不是lapply

      df %>% apply(2, plyr::mapvalues, from = c("a","b","c","d","e"), to = c(5,4,3,2,1)) %>% 
        as.data.frame(stringsAsFactors = F)
           X1   X2   X3
      1     4    4 <NA>
      2     3    4    4
      3     2    1    2
      4  <NA>    3    5
      5     4    1    4
      6  <NA>    3    3
      7  <NA>    1    5
      8     2 <NA>    3
      9     2    3 <NA>
      10    5    1    3
      

      【讨论】:

      • 它给出了一个矩阵而不是一个数据框。当我将它传递给带有 as.data.frame() 的数据框时,它会给出一个充满因子的数据框。我尝试应用 apply,但同样,当我使用 apply 时,它会给出一个矩阵。
      • 基本上你设置stringsAsFactors = FALSE来避免因素
      猜你喜欢
      • 2021-07-24
      • 2016-05-18
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多