Как подсчитать количество уникальных строк в каждом элементе списка

#r #string #list #for-loop #unique

#r #строка #Список #for-цикл #уникальный

Вопрос:

У меня есть список с несколькими строками. Я хотел бы подсчитать количество уникальных строк в каждом элементе списка. Например:

Мой список, называемый test, выглядит следующим образом:

 test <- list(
  c("X", "Y", "Z", "X"),
  c("W", "X", "X"), 
  c("Z", "W",  "Y", "X", "Z", "Z")
)
 

Я хотел бы получить вывод, который может сказать мне что-то вроде:

 [[1]] 3
[[2]] 2
[[3]] 4
 

Я могу легко подсчитать это для каждого отдельного элемента, используя следующий код:

 length(unique(test[[1]]))
 

Однако я не уверен, как автоматизировать это для большого списка. Я попытался создать цикл for, как показано ниже, но я получаю следующую ошибку:

 test_length <- for(i in test){length(unique(test[[i]]))}
 

Ошибка в тесте [[i]]: нет такого индекса на уровне 1

Комментарии:

1. sapply(test, function(element) {length(unique(element))}) просто попробуйте это.

2. Вы можете использовать цикл for, такой как test_length <- rep(NA_integer_,length(test)) for(i in 1:length(test)){ test_length[i] <- length(unique(test[[i]])) }

3. Спасибо! Это сработало отлично 🙂

4. Другой сокращенный вариант: lengths(Map(unique, test))

5. Керри Джексон, ваше предложение выдало следующую ошибку: Ошибка: неожиданное «для» в «test_length <- rep (NA_integer_,длина (тест)) для»

Ответ №1:

Попробуйте использовать lapply вместо

 > lapply(test, function(x) length(unique(x)))

[[1]]
[1] 3

[[2]]
[1] 2

[[3]]
[1] 4
 

Надеюсь, это поможет!

Ответ №2:

Вот один из вариантов с tidyverse

 library(tidyverse)
test %>%
   map_int(n_distinct)
#[1] 3 2 4