我的数据框有person_id,study_id列如下:
person_id study_id
10 1
11 2
10 3
10 4
11 5
我希望通过1项研究或2项研究获得人数(person_id独有)的计数 - 所以不那些对study_id具有特殊价值的人,但是:
我该怎么做?我想也许是一个循环计数,但我想知道是否有一个让它更容易的包?
答案 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
然后我们使用>0
和rowSums
来计算每个人的独特研究。然后我们再次使用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