Как получить уникальные значения и счетчики после разделения строк в каждой ячейке таблицы - PullRequest
0 голосов
/ 23 января 2019

У меня есть датафрейм df.Я хочу разбить значения строк в столбцах a, b и c на основе , и получить столбцы уникальных элементов для каждого столбца и подсчитать эти уникальные элементы, как показано в результате ниже.Как мы можем сделать это в R?Спасибо за вашу помощь.

a <- c("cat, cat, dog", "dog")
b<- c("cat")
c<- c("dog, dog", "cat")

df <- data.frame(position= c("1","2"),a, b, c, stringsAsFactors = F)

Результат, который я хочу:

position    a_uniq  b_uniq  c_uniq  a_uniq_counts   b_uniq_counts   c_uniq_counts
1           cat,dog cat     dog     2               1               1
2           dog     cat     cat     1               1               1

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вот один вариант с tidyverse. Используя mutate_at, разбейте строку в разделителе , и получите уникальные значения с помощью uniqueN

library(tidyverse)
df %>% 
      mutate_at(vars(a:c), funs(uniq_counts = strsplit(., ", ") %>%
                  map_int(n_distinct)))
#  position             a   b        c a_uniq_counts b_uniq_counts c_uniq_counts
#1        1 cat, cat, dog cat dog, dog             2             1             1
#2        2           dog cat      cat             1             1             1
0 голосов
/ 23 января 2019

Я предлагаю вам решение с использованием data.table:

unique_counts <- function(str){
return(uniqueN(unlist(strsplit(gsub(" ", "" ,str), ","))))
}

unique_strings <- function(str){
  return(paste0(unique(unlist(strsplit(gsub(" ", "" ,str), ","))), collapse=","))
}

a <- c("cat, cat, dog", "dog")
b<- c("cat")
c<- c("dog, dog", "cat")


df <- data.frame(position= c("1","2"),a, b, c, stringsAsFactors = F)
df <- as.data.table(df)
for (i in colnames(df)[2:length(colnames(df))]){
  df[ , eval(paste0(i,"_uniq")):=mapply(unique_strings, get(i))]
  df[ , eval(paste0(i,"_uniq_counts")):=mapply(unique_counts, get(i))]
  df[ , eval(i):=NULL]
}

Best!

...