每行计算唯一值的数量

8

我希望能够计算每行唯一值的数量。

例如,这个数据框:

example <- data.frame(var1 = c(2,3,3,2,4,5), 
                  var2 = c(2,3,5,4,2,5), 
                  var3 = c(3,3,4,3,4,5))

我想添加一列,用于计算每行的唯一值数量;例如,第一行有2个唯一值(因为第一行中有2和3),第二行只有1个唯一值(因为第二行只有3)。是否有简单的代码可以实现这一功能?目前我只找到了计算每列唯一值数量的代码。

5
使用 example <- cbind(example, apply(example, 1, function(x)length(unique(x)))) 代码可以将数据框 example 中每一行中唯一值的数量添加为新的一列。 - StrikeR
2个回答

9

这个 apply 函数返回每行中唯一值的数量向量:

apply(example, 1, function(x)length(unique(x)))

您可以使用以下两种方式之一将其附加到数据框中(如果您想将该列命名为 count ):

example <- cbind(example, count = apply(example, 1, function(x)length(unique(x))))

或者
example$count <- apply(example, 1, function(x)length(unique(x)))

1
我们还可以使用向量化的方法来处理正则表达式。在将数据集的每一行元素进行paste操作(do.call(paste0, ...))之后,匹配任何字符的模式并捕获为一组((.)),使用正向前瞻,仅当它在字符串中再次出现时才匹配字符(\\1 - 捕获组的反向引用),并将其替换为空格("")。因此,实际上只剩下那些唯一的字符。然后,使用nchar计算字符串中字符的数量。
example$count <- nchar(gsub("(.)(?=.*?\\1)", "", do.call(paste0, example), perl = TRUE))
example$count
#[1] 2 1 3 3 2 1

1
我点赞了它,虽然晚了两年才看到! - rnorouzian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接