我正在尝试制作一个频率表,其中VAR1是一些但不是所有值,而VAR3过滤了用于构成该表的行。
ISCED是Var1,我只希望值是12和15。如果可能的话,我不想在表中看到FALSE。其次,我只想使用PK_T = 1的行。无法弄清楚该怎么做。
我的DFISCED EMTAK PK_T12233 112245 012233不适用13233 115433 115245 0
我想要ISCED EMTAK频率真233 2真245 0真实433 2
使用您的数据和data.table包,我将数据子集划分为ISCED为12或15的数据,并按EMTAK和PK_T == 1分组,然后使用.N计数出现的次数,然后链接第二个该表达式限制为ISCED为TRUE的表达式。注意,我还从最终表中删除了PK_T变量-它没有意义,因为变量没有变化。
library(data.table)
dt1[ISCED %in% c(12, 15), .N, by = .(EMTAK, PK_T == 1)][PK_T == TRUE, -"PK_T"]
提供
EMTAK N
1: 233 1
2: 433 1
这是对您的数据的正确答案,只有233个出现,其中PK_T为1,另一个出现是NA。
您可以使用table
获取频率。要包含0
次,可以使用as.factor
。您可以使用[
子集x$PK_T==1
的情况。要仅获取ISCED值为12或15的那些,可以使用%in%
:
y <- table(as.factor(x$EMTAK)[!is.na(x$PK_T) & x$PK_T==1])
y <- y[names(y) %in% unique(x$EMTAK[x$ISCED %in% c(12, 15)])]
data.frame(ISCED = TRUE, EMTAK = names(y), Freq = as.vector(y))
# ISCED EMTAK Freq
#1 TRUE 233 2
#2 TRUE 245 0
#3 TRUE 433 1
或仅在满足所有条件的情况下,才使用aggregate
。
aggregate(cbind(Freq=PK_T) ~ EMTAK, x[x$ISCED %in% c(12, 15) &
!is.na(x$PK_T) & x$PK_T==1,], length)
# EMTAK Freq
#1 233 1
#2 433 1
数据:
x <- read.table(header=TRUE, text="ISCED EMTAK PK_T
12 233 1
12 245 0
12 233 NA
13 233 1
15 433 1
15 245 0")
如果我们假设您的数据集与您提供的一样:
myDF <- data.frame(ISCED=c(12, 12, 12, 13, 15, 15), EMTAK=c(233, 245, 233, 233, 433, 245), PK_T=c(1, 0, NA, 1, 1, 0))
并且您只希望对于值PK_T = 1仅保留ISCED = 12和ISCED = 15]的值。然后您可以尝试:
test <- myDF %>%
na.omit %>%
filter(., ISCED==12 | ISCED==15 & PK_T == 1) %>%
select(EMTAK, PK_T) %>%
mutate(frequency= table(.$EMTAK))