计算值的共现并创建计数

时间:2018-03-11 06:09:10

标签: r for-loop count match

我有一个如下所示的数据框:

x <- c(1,2,1,1,4,NA,NA,NA,NA,NA)
y <- c(21,22,23,21,21,NA,NA,NA,NA,NA)
z <- c(NA,NA,NA,NA,NA,1,2,3,4,5)
dat <- data.frame(x,y,z)   

我想计算x中x的值出现的次数 取与x那一行对应的y值。我假设我需要使用for循环或申请。 计数将填充数据框或矩阵,其列标题对应于y值。 我已经浏览了Stack Overflow并且我已经尝试过使用哪个和%in%而没有运气。我也尝试了总和,但它只查看一行并总结匹配的事件。我想看看所有 感兴趣的另一列的行(z)。

结果看起来像这样(z表示行标签,y表示列标签):

  21  22  23
1  2   0   1
2  0   1   0
3  0   0   0
4  1   0   0
5  0   0   0

3 个答案:

答案 0 :(得分:2)

您可以使用基础R的table

dat$x <- factor(dat$x, levels = unique(dat$z));
as.data.frame.matrix(table(dat[, 1:2]));
#  21 22 23
#1  2  0  1
#2  0  1  0
#3  0  0  0
#4  1  0  0
#5  0  0  0

说明:将列条目x转换为factor级别z,然后使用table计算每y条目的出现次数x }}。 factor(...)命令可确保在z中考虑来自table的所有可能值。

答案 1 :(得分:0)

以下是一个使用tidyverse的选项,其中mutate'x'与levels指定为unique的{​​{1}}值,然后获取{{1} '和'y',将NA元素(count)和na.omit从'long'移除到'wide'

spread

答案 2 :(得分:0)

我的一位同事也提供了以下解决方案:

library(tidyr)
dat$x <- factor(dat$x, levels = c("1", "2", "3", "4"))
reshape2::dcast(dat, x ~ y, fun.aggregate = length, drop = FALSE)