Подсчет уникальных предметов во фрейме данных - PullRequest
8 голосов
/ 28 марта 2011

Я хочу простой подсчет количества предметов в каждом состоянии исследования.Данные выглядят примерно так:

subjectid  cond   obser variable
1234        1        1      12   
1234        1        2      14
2143        2        1      19
3456        1        1      12 
3456        1        2      14 
3456        1        3      13   

etc       etc    etc       etc

Это большой набор данных, и не всегда очевидно, сколько уникальных предметов влияет на каждое условие и т. Д.

У меня есть это в данных.frame.

Что я хочу, это что-то вроде

cond   ofSs 
1       122 
2        98

Где для каждого "условия" я получаю количество уникальных Ss, вносящих данные в это условие.Похоже, это должно быть больно просто.

Ответы [ 4 ]

13 голосов
/ 28 марта 2011

Используйте функцию ddply из пакета plyr:

require(plyr)
df <- data.frame(subjectid = sample(1:3,7,T), 
                 cond = sample(1:2,7,T), obser = sample(1:7))

> ddply(df, .(cond), summarize, NumSubs = length(unique(subjectid)))
  cond NumSubs
1    1       1
2    2       2

Функция ddply "разбивает" кадр данных по переменной cond и создает итоговый столбец NumSubs для каждого субкадра данных.

5 голосов
/ 28 марта 2011

Используя ваш фрагмент данных, которые я загрузил в объект dat:

> dat
  subjectid cond obser variable
1      1234    1     1       12
2      1234    1     2       14
3      2143    2     1       19
4      3456    1     1       12
5      3456    1     2       14
6      3456    1     3       13

Тогда один из способов сделать это - использовать агрегат для подсчета уникального subjectid (предполагая, что вы имели в виду"Ss" ???

> aggregate(subjectid ~ cond, data = dat, FUN = function(x) length(unique(x)))
  cond subjectid
1    1         2
2    2         1
4 голосов
/ 29 марта 2011

или, если вам нравится SQL и вы не против установить пакет:

library(sqldf);
sqldf("select cond, count(distinct subjectid) from dat")
3 голосов
/ 28 марта 2011

Просто, чтобы дать вам еще больший выбор, вы также можете использовать tapply

tapply(a$subjectid, a$cond, function(x) length(unique(x)))
1 2 
2 1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...