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

У меня есть пример фрейма данных

       Sample1    Sample2      Sample3      Sample4        
Cat     0           0            0           1
Dog     0           0            1           0
Rabbit  0           0            0           1
Mouse   1           1            1           1 
Snake   1           1            0           1
....

Я бы хотел посчитать количество уникальных животных для каждого образца. И в идеале генерировать какой-то список для каждого образца, который показывает, какие уникальные животные. Таким образом, вы можете видеть, что кошки уникальны для образца 4, собаки уникальны для образца 3, а кролики уникальны для образца 3. Однако образец 1 и образец 2 не имеют уникальных животных, потому что другие образцы содержат этих животных. Я использовал это для подсчета sapply(data, function(x) length(unique(x))), но набор данных настолько велик, что я не могу сказать, насколько это точно.

Спасибо за любую помощь !!

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Я не получил, если вы хотели количество уникальных значений по строке или столбцу. Я предлагаю и

Если у вас есть объемные данные, вы должны взглянуть на data.table.

Давайте рассмотрим глупый пример

library(data.table)
df = data.table(
  x = c(1,2),
  y = c(1,1),
  z = c(2,3)
)

уникальный по столбцу

Простейший ответ:

df[,lapply(.SD,uniqueN)]

уникально по строке

Решением может быть преобразование ваших данных в длинный формат и подсчет по группам

Затем, вы генерируете идентификатор строки (seq_len(.N) означает от 1 до n в data.table глаголах). Этот столбец используется для поворота данных (melt - встроенная функция в data.table, эквивалентная pivot_long в тидире), а затем используется uniqueN встроенная функция из data.table.

df[,'id' := seq_len(.N)]
df2 <- melt(df, id.vars = "id")
df2[, (count_unique = uniqueN(value)), by = "id"]

df2[, (count_unique = uniqueN(value)), by = "id"]
   id V1
1:  1  2
2:  2  3
0 голосов
/ 09 апреля 2020

Вы можете сделать это с помощью lapply следующим образом:

uniqueList = lapply(df, unique)
numberOfUniques = lapply(uniqueList, length)

Пример:

Использование mtcars для df

> uniqueList

$mpg
 [1] 21.0 22.8 21.4 18.7 18.1 14.3 24.4 19.2 17.8 16.4 17.3 15.2 10.4 14.7 32.4 30.4 33.9 21.5 15.5
[20] 13.3 27.3 26.0 15.8 19.7 15.0

$cyl
[1] 6 4 8

$disp
 [1] 160.0 108.0 258.0 360.0 225.0 146.7 140.8 167.6 275.8 472.0 460.0 440.0  78.7  75.7  71.1 120.1
[17] 318.0 304.0 350.0 400.0  79.0 120.3  95.1 351.0 145.0 301.0 121.0

$hp
 [1] 110  93 175 105 245  62  95 123 180 205 215 230  66  52  65  97 150  91 113 264 335 109

$drat
 [1] 3.90 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.07 2.93 3.00 3.23 4.08 4.93 4.22 3.70 3.73 4.43 3.77
[20] 3.62 3.54 4.11

$wt
 [1] 2.620 2.875 2.320 3.215 3.440 3.460 3.570 3.190 3.150 4.070 3.730 3.780 5.250 5.424 5.345 2.200
[17] 1.615 1.835 2.465 3.520 3.435 3.840 3.845 1.935 2.140 1.513 3.170 2.770 2.780

$qsec
 [1] 16.46 17.02 18.61 19.44 20.22 15.84 20.00 22.90 18.30 18.90 17.40 17.60 18.00 17.98 17.82 17.42
[17] 19.47 18.52 19.90 20.01 16.87 17.30 15.41 17.05 16.70 16.90 14.50 15.50 14.60 18.60

$vs
[1] 0 1

$am
[1] 1 0

$gear
[1] 4 3 5

$carb
[1] 4 1 2 3 6 8
...