r如何获得重复值的总数

时间:2014-06-11 15:13:48

标签: r loops count

我的数据框有person_id,study_id列如下:

 person_id    study_id    
 10            1          
 11            2          
 10            3          
 10            4          
 11            5          

我希望通过1项研究或2项研究获得人数(person_id独有)的计数 - 所以那些对study_id具有特殊价值的人,但是:

  • 2人1研究
  • 3人2研究
  • 1人参与3项研究

我该怎么做?我想也许是一个循环计数,但我想知道是否有一个让它更容易的包?

5 个答案:

答案 0 :(得分:3)

要获得更符合预期输出的样本数据集,我将使用此

dd <- data.frame(
   person_id = c(10, 11, 15, 12, 10, 13, 10, 11, 12, 14, 15), 
   study_id = 1:11
)

现在我可以用一定数量的研究来计算人数。

table(rowSums(with(dd, table(person_id, study_id))>0))

# 1 2 3 
# 2 3 1 

顶线是研究数量,底线是研究数量的人数。

这是因为

with(dd, table(person_id, study_id))

返回

         study_id
person_id 1 2 3 4 5 6 7 8 9 10 11
       10 1 0 0 0 1 0 1 0 0  0  0
       11 0 1 0 0 0 0 0 1 0  0  0
       12 0 0 0 1 0 0 0 0 1  0  0
       13 0 0 0 0 0 1 0 0 0  0  0
       14 0 0 0 0 0 0 0 0 0  1  0
       15 0 0 1 0 0 0 0 0 0  0  1

然后我们使用>0rowSums来计算每个人的独特研究。然后我们再次使用table来总结结果。

为数据创建表会占用太多内存,您可以尝试

table(with(dd, tapply(study_id, person_id, function(x) length(unique(x)))))

这是一种稍微不同的方式来获得相同的东西。

答案 1 :(得分:3)

您可以使用聚合函数来获取每个用户的计数。

然后再次使用它来获取每次计数

即。假设您的数据称为“测试”

person_id study_id
        10 1
        11 2
        10 3
        10 4
        11 5
        12 NA

您可以将NA设置为零等数字,以便不被忽略,即

test$study_id[is.na(test$study_id)] = 0

然后你可以运行相同的函数,但条件是study_id必须大于零

stg=setNames(
aggregate(
study_id~person_id,
data=test,function(x){sum(x>0)}),
c("person_id","num_studies"))

输出:

STG
  person_id num_studies
        10 3
        11 2
        12 0

然后执行相同操作以获取计数

setNames(
aggregate(
person_id~num_studies,
data=stg,length),
c("num_studies","num_users"))

输出:

  
    

num_studies num_users
               0 1
               2 1
               3 1

  

答案 2 :(得分:1)

以下是使用dplyr

的解决方案
library(dplyr)

tmp <- df %>%
  group_by(person_id) %>%
  summarise(num.studies = n()) %>%
  group_by(num.studies) %>%
  summarise(num.persons = n())

答案 3 :(得分:1)

> dat <- read.table(h=T, text = "person_id    study_id    
   10            1          
   11            2          
   10            3          
   10            4          
   11            5
   12            6")

我认为您可以使用xtabs。我可能误解了这个问题,但看起来这就是你想要的。

> table(xtabs(dat))
# 10 11 12
#  3  2  1

答案 4 :(得分:-1)

df <- data.frame(
  person_id = c(10,11,10,10,11,11,11),
  study_id = c(1,2,3,4,5,5,1))
# remove replicated rows
df <- unique(df)

# number of studies each person has been in:
summary(as.factor(df$person_id))
#10 11 
# 3  4 

# number of people in each study
summary(as.factor(df$study_id))
# 1 2 3 4 5 
# 2 1 1 1 2