获取 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"))
给定以下数据框(从我无法控制内容的 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"))