【问题标题】:Group by and determine which entries there are in a given group分组依据并确定给定组中有哪些条目
【发布时间】:2017-03-09 14:54:31
【问题描述】:

假设你有一个数据框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

【问题讨论】:

  • 如果你现在的意思是不丢失,你可以用 sum(!is.na(x)) > 0 之类的函数 summarise_each (或一些类似的动词)
  • @Frank 你能举个例子吗?
  • 您可以在问题中提供一个完整的示例——包括您期望的输出。我只是在黑暗中试探你的尝试。
  • @Frank 公平点!我用希望的输出编辑了我的帖子。我尝试使用dcast.data.table 来做这个表,但它给了我每个变量条目的输出 1。

标签: r group-by dplyr


【解决方案1】:

这段代码解决了你的问题:

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))

【讨论】:

  • 感谢您的回答,但是,这并不是我想要的。您的解决方案返回在给定年份中所有四个属性都不是 NA 的次数。我想知道每个给定年份的哪些属性不是 NA。
  • @mike.dl 你能把这个答案中的 sum() 改成 sum() > 0 吗?
猜你喜欢
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多