如何使用带有两个参数的 table by? R

How to use table by with two arguments? R

我的数据集是这样的

df

ID Year  County  APV   sample 
1  2014   A       1      1
1  2015   A       1      1
1  2016   A       0      0
1  2017   A       NA     0
1  2018   A       NA     0
1  2019   A       NA     0

2  2014   B       1      1
2  2015   B       1      1
2  2016   B       1      1
2  2017   B       1      1
2  2018   B       0      0
2  2019   B       NA     0

3  2014   A       1      1
3  2015   A       1      1
3  2016   A       0      0
3  2017   A       NA     0
3  2018   A       NA     0
3  2019   A       NA     0

以此类推

所以我想将这些数据制表。

如果我只想按年份制表

datos<-as.data.frame(table(df$APV==0 & df$sample==0, by=df$Year))

我得到的数据集是这样的:

df1

Var1   by   Freq
FALSE  2014   3
TRUE   2014   0

FALSE  2015   3
TRUE   2015   0

FALSE  2016   1
TRUE   2016   2

.       .     .
.       .     .
.       .     .

所以 false 表示仍然开放的公司。

如何按年份 县制表?

APV 告诉我第一个关闭的企业,(0)所以我想知道有多少企业按年份和县关闭

有两种方法。

我添加 !is.na(APV) 有两个原因:(1) 我不清楚您希望在那里发生什么; (2) table 实际上比 xtabsNA 更稳健,所以我希望这两个结果相同。这两种方法的 前提 是相同的,但它们处理 NA 的方式确实不同。

table

您可能只需要知道 table 接受任意数量的参数,因此

head(as.data.frame(table(df$Var1, df$Year, df$County)))
#    Var1 Var2 Var3 Freq
# 1 FALSE 2014    A    2
# 2  TRUE 2014    A    0
# 3 FALSE 2015    A    2
# 4  TRUE 2015    A    0
# 5 FALSE 2016    A    0
# 6  TRUE 2016    A    2

虽然名称丢失了,但它仍然有效。

xtabs

out <- as.data.frame(
  xtabs(~ Var1 + Year + County,
  data = transform(df, Var1 = (!is.na(APV) & APV == 0 & sample == 0)))
)
head(out)
#    Var1 Year County Freq
# 1 FALSE 2014      A    2
# 2  TRUE 2014      A    0
# 3 FALSE 2015      A    2
# 4  TRUE 2015      A    0
# 5 FALSE 2016      A    0
# 6  TRUE 2016      A    2

(为了简单起见,我使用了 transform。)

do.call 用于动态列

out2 <- as.data.frame(
  do.call(table, subset(transform(df, Var1 = (!is.na(APV) & APV == 0 & sample == 0)), 
                        select = c(Var1, Year, County)))
)

(相同的结果)