获取 R 中每行中每个唯一值的计数

Get Count for each unique value in each Row in R

给定以下数据框(从我无法控制内容的 csv 文件中读取)

          C1 C2 C3 C4 C5 C6 C7 C8 C9
        1  a  a  a  c  d  b  c  c  a
        2  a  a  b  b  c  b  b  a  b
        3  a  c  c  d  d  b  c  b  b
        4  c  a  d  c  d  d  c  d  d

我需要计算每行中每个唯一值的数量。如果单个值出现 5 次或更多次,则应确定该行无效(可能通过添加额外的 valid/invalid 列)。我不关心哪个值出现 5 次或更多次,只关心任何值。在上面,第 2 行和第 4 行是无效的。不幸的是,我不知道 csv 文件中会有多少行数据。

如果您只想知道该行是否包含任何条目中的四个以上,您可以执行以下操作:

df$invalid <- apply(df, 1, function(x) max(table(x)) > 4)
#>   C1 C2 C3 C4 C5 C6 C7 C8 C9 invalid
#> 1  a  a  a  c  d  b  c  c  a   FALSE
#> 2  a  a  b  b  c  b  b  a  b    TRUE
#> 3  a  c  c  d  d  b  c  b  b   FALSE
#> 4  c  a  d  c  d  d  c  d  d    TRUE

如果你真的想要每一行的计数,你可以这样做:

cbind(df, t(apply(df[-10], 1,function(x) table(factor(x, levels = letters[1:4])))))
#>   C1 C2 C3 C4 C5 C6 C7 C8 C9 invalid a b c d
#> 1  a  a  a  c  d  b  c  c  a   FALSE 4 1 3 1
#> 2  a  a  b  b  c  b  b  a  b    TRUE 3 5 1 0
#> 3  a  c  c  d  d  b  c  b  b   FALSE 1 3 3 2
#> 4  c  a  d  c  d  d  c  d  d    TRUE 1 0 3 5

如果我们将行索引也用作列之一,我们也可以应用一次table

cbind(df, as.data.frame.matrix(table(c(row(df)), unlist(df))))
#   C1 C2 C3 C4 C5 C6 C7 C8 C9 a b c d
#1  a  a  a  c  d  b  c  c  a 4 1 3 1
#2  a  a  b  b  c  b  b  a  b 3 5 1 0
#3  a  c  c  d  d  b  c  b  b 1 3 3 2
#4  c  a  d  c  d  d  c  d  d 1 0 3 5

如果我们需要创建 'invalid' 列

t1 <- table(c(row(df)), unlist(df))
cbind(df, as.data.frame.matrix(t1), invalid = as.logical(rowSums(t1 > 4)))
#  C1 C2 C3 C4 C5 C6 C7 C8 C9 a b c d invalid
#1  a  a  a  c  d  b  c  c  a 4 1 3 1   FALSE
#2  a  a  b  b  c  b  b  a  b 3 5 1 0    TRUE
#3  a  c  c  d  d  b  c  b  b 1 3 3 2   FALSE
#4  c  a  d  c  d  d  c  d  d 1 0 3 5    TRUE

数据

df <- structure(list(C1 = c("a", "a", "a", "c"), C2 = c("a", "a", "c", 
"a"), C3 = c("a", "b", "c", "d"), C4 = c("c", "b", "d", "c"), 
    C5 = c("d", "c", "d", "d"), C6 = c("b", "b", "b", "d"), C7 = c("c", 
    "b", "c", "c"), C8 = c("c", "a", "b", "d"), C9 = c("a", "b", 
    "b", "d")), class = "data.frame", row.names = c("1", "2", 
"3", "4"))