计算 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
我有一个数据框如下:
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