根据条件

时间:2018-02-21 14:19:14

标签: r

假设我有以下Dataframe。我需要计算18岁以下年龄的百分比,按ID和组分组。 我需要的是例如 1 a 50%或3 a 0% 我可以分两步计算所有并计算18岁以下,然后合并这两个框架,但我想知道我是否可以一步完成。

a <- group_by(ID, Group ) %>% summarize(countAllData = n())
b <- group_by(ID, Group ) %>% filter(lebensalter < 18) %>%     summarize(countUnder18 = n())
merge(a, b, by=c("ID", "Group"), all=TRUE)
final[is.na(final)] <- 0 
percentageUnder18 = ((final$countUnder18/final$countAllData) * 100)
cbind(final, roundedPercentage)

有什么建议吗?

ID Group Age
1  a      20
1  a      17 
1  b      16
2  c      23
2  c      11
2  d      12
3  e      20

2 个答案:

答案 0 :(得分:1)

您可以使用inttypes.h,即

aggregate

给出,

aggregate(Age ~ ID+Group, df, FUN = function(i) sum(i < 18)/length(i))

答案 1 :(得分:1)

取指标变量Age < 18的平均值。最后一行是可选的,但是如果你使用它,这个例子中的输出看起来会好一些。

library(dplyr)

DF %>% 
   group_by(ID, Group) %>% 
   summarize("%Under18" = round(100 * mean(Age < 18))) %>% 
   ungroup %>%
   as.data.frame

,并提供:

  ID Group %Under18
1  1     a       50
2  1     b      100
3  2     c       50
4  2     d      100
5  3     e        0

注意

可重复输入的输入:

Lines <- "
ID Group Age
1  a      20
1  a      17 
1  b      16
2  c      23
2  c      11
2  d      12
3  e      20"
DF <- read.table(text = Lines, header = TRUE)