我有一个如下数据框:
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(),但没有成功。同样,如果您可以为此提供更优雅的解决方案,那就太好了。
我们可以使用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)
这里给出更详细的解释