R中数据帧中每一行的唯一元素计数

sma*_*aug 4 r dataframe

我有一个如下数据框:

Group1  Group2  Group3  Group4
A       B       A       B   
A       C       B       A   
B       B       B       B   
A       C       B       D   
A       D       C       A   
Run Code Online (Sandbox Code Playgroud)

我想在数据框中添加一个新列,该列将在每一行中包含唯一元素的计数。所需的输出:

Group1  Group2  Group3  Group4  Count
A       B       A       B       2
A       C       B       A       3
B       B       B       B       1
A       C       B       D       4
A       D       C       A       3
Run Code Online (Sandbox Code Playgroud)

我可以使用以下方式为每一行找到这样的计数

length(unique(c(df[,c(1,2,3,4)][1,])))
Run Code Online (Sandbox Code Playgroud)

我想对数据框中的所有行执行相同的操作。我尝试使用var = 1的apply(),但没有成功。同样,如果您可以为此提供更优雅的解决方案,那就太好了。

akr*_*run 5

我们可以使用applywith MARGIN =1遍历行

df1$Count <- apply(df1, 1, function(x) length(unique(x)))
df1$Count
#[1] 2 3 1 4 3
Run Code Online (Sandbox Code Playgroud)

或使用 tidyverse

library(dplyr)
df1 %>%
    rowwise() %>%
    do(data.frame(., Count = n_distinct(unlist(.))))
# A tibble: 5 × 5
#   Group1 Group2 Group3 Group4 Count
#*  <chr>  <chr>  <chr>  <chr> <int>
#1      A      B      A      B     2
#2      A      C      B      A     3
#3      B      B      B      B     1
#4      A      C      B      D     4
#5      A      D      C      A     3
Run Code Online (Sandbox Code Playgroud)

我们还可以使用它regex来更快地执行此操作。它基于这样的假设:每个单元格只有一个字符

nchar(gsub("(.)(?=.*?\\1)", "", do.call(paste0, df1), perl = TRUE))
#[1] 2 3 1 4 3
Run Code Online (Sandbox Code Playgroud)

这里给出更详细的解释

  • 正则表达式非常聪明,但是如果字符串长于一个字母,它将不起作用,不是吗? (3认同)
  • @akrun,从我的角度来看,这具有误导性。至少,您应该在答案中清楚地说明这一点,但是您往往不这样做,而是基于对真实数据集的隐含假设进行回答。另外,您自己链接的问题中包含标准的适用答案。 (2认同)