根据每列的有效值列表计算每行的无效值 (R)
Counting invalid values per row based on list of valid values per column (R)
我正在寻找一种快速计算每行无效值的方法。这里以一个数据框为例:
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 函数,但不幸的是找不到任何可行的解决方案。预先感谢您提供任何有用的提示。
在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 = .)
更新
基于更新后的 post
data$invalid <- Reduce(`+`, lapply(names(valid),
function(nm) Reduce(`&`, lapply(valid[[nm]], function(x) data[[nm]] != x))))
我正在寻找一种快速计算每行无效值的方法。这里以一个数据框为例:
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 函数,但不幸的是找不到任何可行的解决方案。预先感谢您提供任何有用的提示。
在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 = .)
更新
基于更新后的 post
data$invalid <- Reduce(`+`, lapply(names(valid),
function(nm) Reduce(`&`, lapply(valid[[nm]], function(x) data[[nm]] != x))))