【问题标题】:Counting invalid values per row based on list of valid values per column (R)根据每列的有效值列表计算每行的无效值 (R)
【发布时间】:2021-01-20 20:20:30
【问题描述】:

我正在寻找一种快速计算每行无效值的方法。这里以一个数据框为例:

data <- data.frame("c1" = c(1,1,3,0,2,2,3,1,2,9),
                   "c2" = c(2,2,3,4,1,2,1,2,1,2),
                   "c3" = c(2,3,3,4,3,3,3,3,2,9),
                   "c4" = c(4,4,0,0,1,0,3,0,3,9),
                   "c5" = c(9,1,2,3,2,1,2,3,2,1))

我想要一个额外的数字列,以按情况显示有多少值与列表中定义的有效值不对应。例如,此列表可能如下所示:

valid <- list("c1" = c(1:4,9),
              "c2" = c(1:3,9),
              "c3" = c(2:4,9),
              "c4" = c(0:3,9),
              "c5" = c(1:3,9))

所以我在这个例子中寻找的列是:

data$invalid <- c(1,1,0,2,0,0,0,0,0,0)

我更喜欢 tidyverse 解决方案。我尝试了一些不同的 purrr::map 函数,但不幸的是找不到任何可行的解决方案。提前感谢您提供任何有用的提示。

【问题讨论】:

    标签: r list lookup purrr counting


    【解决方案1】:

    base R中,我们可以使用Map

    data$invalid <- unlist(Map(function(x, y) 
              sum(!x %in% y), data, valid[names(data)]))
    

    purrr

    library(purrr)
    library(dplyr)
    imap_int(data, ~  sum(!.x %in% valid[[.y]])) %>%
        mutate(data, invalid = .)
    

    更新

    根据更新后的帖子

    data$invalid <- Reduce(`+`, lapply(names(valid), 
      function(nm) Reduce(`&`, lapply(valid[[nm]], function(x) data[[nm]] != x))))
    

    【讨论】:

    • 感谢您的快速响应 akrun。不幸的是,在今天早上将此解决方案应用于更大的数据框之后(我想你已经很晚了),我意识到它只有在行数和列数相同的情况下才有效。我的实际 df 有一万行和几十列(与列表中的对象数相同)。因此,我更改了示例数据框。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多