【问题标题】:How to count occurences in several variables by different criteria and grouped by two variables如何按不同标准计算多个变量中的出现次数并按两个变量分组
【发布时间】:2016-12-04 19:54:23
【问题描述】:

使用R,我想用另外两个变量来计算两个变量中出现的次数; IDS 和年份。计数的变量之一需要按唯一值计数。 我真的四处寻找答案,但似乎找不到。 我有一个这样的数据集(尽管包含更多变量):

IDS = c(1,1,1,1,1,1,2,2) 
year = c(1,1,1,1,1,2,1,1) 
x = c(5, 5, 5, 10, 2, NA, 3, 3)
y = c(1, 2, 4, 0, NA, 2, 0, NA)
dfxy = data.frame(IDS, year, x, y)

dfxy
   IDS year   x  y
1   1    1    5  1
2   1    1    5  2
3   1    1    5  4
4   1    1   10  0
5   1    1    2 NA
6   1    2   NA  2
7   2    1    3  0
8   2    1    3 NA

我想要计算每个 IDS 和每年在 x 和 y 两列中出现的次数。 x 中的计数必须是 x 的唯一值。 我想要这样的输出:

   IDS year x y
1   1    1  3 4
2   1    2  0 1
3   2    1  1 1

和cbind中的答案类似

Aggregate / summarize multiple variables per group (i.e. sum, mean, etc)

对我来说应该是这样的

aggregate(cbind(x, y)~IDS+year, data=dfxy, ???)

NA 算作没有出现,任何数字都算作 y 中的出现,在 x 中必须计算每个唯一出现的次数(只要它不是 NA)。 x 和 y 中都没有带 NA 的行。 我尝试使用长度而不是总和,但这似乎只是总结了 x 和 y 的行数。

我可以在其中找到答案的想法或链接? 谢谢

【问题讨论】:

  • 我猜 'x' 的第二个值是 0,因为没有非 NA 元素
  • 确实,现在更正了。

标签: r aggregate cbind


【解决方案1】:

aggregate中,你需要指定na.action参数,因为公式接口默认为na.omit,这将排除你的大部分数据:

aggregate(cbind(x, y) ~ IDS + year, dfxy, 
          FUN = function(x){sum(!is.na(x))}, na.action = na.pass)
##   IDS year x y
## 1   1    1 3 3
## 2   2    1 1 1
## 3   1    2 0 1

对于新问题,添加unique

aggregate(cbind(x, y) ~ IDS + year, df, 
          FUN = function(x){sum(!is.na(unique(x)))}, na.action = na.pass)
##   IDS year x y
## 1   1    1 3 4
## 2   2    1 1 1
## 3   1    2 0 1

aggregate(cbind(x, y) ~ IDS + year, df, 
          FUN = function(x){length(unique(na.omit(x)))}, na.action = na.pass)
##   IDS year x y
## 1   1    1 3 4
## 2   2    1 1 1
## 3   1    2 0 1

【讨论】:

  • 问题略有变化,见上,没有及时看到你的答案@alistaire,抱歉。
【解决方案2】:

我们可以试试dplyr

library(dplyr)
dfxy %>% 
     group_by(IDS, year) %>%
     summarise_each(funs(sum(!is.na(.))))

【讨论】:

  • 感谢@akrun,完美运行!但是请参阅我更新的问题,因为我忘记了一些东西(在一分钟内)
  • 所以对于上一个问题,变量 x 不需要按唯一值计算,而是以与 y 类似的方式计算,您的答案是完美的@akrun。我的错误是我发现数据集的差异较晚。
  • 对不起@akrun,我问了其他人告诉我这样做,但我明白你的意思,如果下次发生,我会记住它!
猜你喜欢
  • 2013-08-31
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
相关资源
最近更新 更多