计算 R 中数据框中分隔的唯一字符串

counting delimited unique strings in a data frame in R

我有一个数据框如下:

a <- c(1, 2, 3, 4)
b <- c("AA; AA; BC", "BC; DE", "AA; BC; BC", "DE; DE")
df <- data.frame(a,b)

我想计算 b 列中每个字符串中唯一的两个字母组合的数量。所以正确答案是 2, 2, 2, 1.

如果我在 df 之外创建一个向量

test <- c("AA", "AA", "BC")

然后

y <- length(stri_unique(test))

y 正确 returns 2. 但是如果我尝试在 df 中实现它:

df <- mutate(df, new_column = length(stri_unique(df$b)))

它returns每一行都是1024的整数,肯定是不对的;正确的答案是 2, 2, 2, 1。试图理解为什么它会这样中断。已尝试指定 sep = ";"但后来我得到一个错误,将 2 个参数传递给 length,它接受一个参数。任何建议表示赞赏。

我们可以在分隔符处拆分字符串,将 list 元素与 stri_unique 一起应用,并得到 list

lengths
library(dplyr)
library(purrr)  
library(stringi)  
df %>% 
    mutate(new_column = lengths(map(strsplit(b, ";\s*"), stri_unique)))

-输出

# a          b new_column
#1 1 AA; AA; BC          2
#2 2     BC; DE          2
#3 3 AA; BC; BC          2
#4 4     DE; DE          1

data.table 选项使用 strsplit + uniqueN

> setDT(df)[, uniqCnt := sapply(strsplit(b, ";\s"), uniqueN)][]
   a          b uniqCnt
1: 1 AA; AA; BC       2
2: 2     BC; DE       2
3: 3 AA; BC; BC       2
4: 4     DE; DE       1

或者使用 Base R

df$Unq_count <-  unlist(lapply(strsplit(df$b, ";\s"), function(x) length(unique(x))))

  a          b Unq_count
1 1 AA; AA; BC         2
2 2     BC; DE         2
3 3 AA; BC; BC         2
4 4     DE; DE         1