Вот вариант в base R
. После разделения первого столбца на ;
, за которым следует ноль или более пробелов (\\s*
), получите lengths
из list
и найдите sum
, используя tapply
lst1 <- strsplit(df[[1]], ";\\s*")
l1 <- lengths(lst1)
tapply(rep(1/l1, l1), unlist(lst1), sum)
# A B C D E F
#1.0000000 1.3333333 0.5833333 0.5833333 0.2500000 0.2500000
Или в tidyverse
, мы можем использовать separate_rows
, чтобы разделить столбец, а затем выполнить группировку по summarise
library(tibble)
library(dplyr)
library(tidyr)
df %>%
mutate(rn = row_number()) %>%
separate_rows(v1) %>%
add_count(rn) %>%
mutate(n = 1/n) %>%
group_by(v1) %>%
summarise(n = sum(n))
# A tibble: 6 x 2
# v1 n
# <chr> <dbl>
#1 A 1
#2 B 1.33
#3 C 0.583
#4 D 0.583
#5 E 0.25
#6 F 0.25
data
df <- structure(list(v1 = c("A; B", "A; B", "B; C; D", "C; D; E; F"
)), class = "data.frame", row.names = c(NA, -4L))