分组并确定给定组中的条目

时间:2017-03-09 14:54:31

标签: r group-by dplyr

假设您的数据框df包含5个属性:x1, x2, x3, x4, Year,如下所示:

set.seed(1)
x1   <- 1:30
x2   <- rnorm(10)
x3   <- rchisq(25, 2, ncp = 0)
x4   <- rpois(6, 0.94)
Year <- sample(2011:2014,30,replace=TRUE)

noRow <- max(length(x1), length(x2), length(x3), length(x4), length(Year))

df <- list(x1=x1, x2=x2, x3=x3, x4=x4, Year=Year)
attributes(df) <- list(names = names(df), row.names=1:30, class='data.frame')

和输出

x1         x2        x3   x4 Year
1   1 -0.6264538 4.2807226    0 2014
2   2  0.1836433 1.6273105    0 2014
3   3 -0.8356286 0.3144031    0 2012
4   4  1.5952808 0.6216108    0 2012
5   5  0.3295078 0.9374638    1 2014
6   6 -0.8204684 0.1363947    2 2013
7   7  0.4874291 2.4985843 <NA> 2013
8   8  0.7383247 2.0162627 <NA> 2012
9   9  0.5757814 2.7218900 <NA> 2012
10 10 -0.3053884 2.4119764 <NA> 2014
11 11       <NA> 1.1082308 <NA> 2013
12 12       <NA> 2.4140052 <NA> 2011
13 13       <NA> 3.1249573 <NA> 2011
14 14       <NA> 0.2615523 <NA> 2012
15 15       <NA> 0.4381074 <NA> 2014
16 16       <NA> 0.6944394 <NA> 2013
17 17       <NA> 0.8599189 <NA> 2014
18 18       <NA> 0.2924151 <NA> 2013
19 19       <NA> 1.6834339 <NA> 2012
20 20       <NA> 0.4848175 <NA> 2012
21 21       <NA> 3.1606987 <NA> 2011
22 22       <NA> 2.3705121 <NA> 2011
23 23       <NA> 0.7808625 <NA> 2013
24 24       <NA> 0.4621734 <NA> 2011
25 25       <NA> 1.9421776 <NA> 2012
26 26       <NA>      <NA> <NA> 2013
27 27       <NA>      <NA> <NA> 2014
28 28       <NA>      <NA> <NA> 2012
29 29       <NA>      <NA> <NA> 2012
30 30       <NA>      <NA> <NA> 2011

我想按年分组并确定在给定年份我们是否在一个或多个属性中没有条目。 使用

library("dplyr")
df1 <- df %>%
  dplyr::group_by(Year) %>%
  dplyr::mutate(count = n())

只给出了给定年份中的条目数,但它并没有告诉我在给定年份中哪些属性存在/不存在。 感谢您分享您的想法。

希望输出:

Year  x1   x2   x3   x4
2011   1    0    1    0
2012   1    1    1    1
2013   1    1    1    1
2014   1    1    1    1

其中1表示在给定年份中变量至少有一个条目,否则为0

1 个答案:

答案 0 :(得分:0)

此代码解决了您的问题:

df$attrib_ok <- !is.na(rowSums(df[1:4]))
df1 <- df %>%
        dplyr::group_by(Year) %>%
        dplyr::mutate(count=sum(attrib_ok)) %>%
        dplyr::select(-attrib_ok)

但似乎你创建了一个腐败的数据框,这个解决方案不起作用 您必须先创建一个非损坏的数据帧,如下所示:

set.seed(1)
x1   <- 1:30
x2   <- c(rnorm(10), rep(NA, 20))
x3   <- c(rchisq(25, 2, ncp = 0), rep(NA, 5))
x4   <- c(rpois(6, 0.94), rep(NA, 24))
Year <- sample(2011:2014,30,replace=TRUE)
df <- data.frame(x1,x2,x3,x4,Year)

获取您希望输出的代码:

df1 <- data.frame(Year=df$Year,!is.na(df[1:4]))
df1 <- aggregate(.~Year, data = df1, FUN = sum)
df1 <- data.frame(Year=df1$Year, apply(apply(df1[,2:5], 2, as.logical), 2, as.numeric))