我有一个如下所示的数据框:
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
答案 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)