【问题标题】:How to use table by with two arguments? R如何使用带有两个参数的表? R
【发布时间】:2021-04-07 13:58:41
【问题描述】:

我的数据集是这样的

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)所以我想知道按年份和县关闭的企业数量

【问题讨论】:

    标签: r dataframe tabular


    【解决方案1】:

    有两种方法。

    我添加了!is.na(APV) 有两个原因:(1) 我不清楚你期望在那里发生什么; (2) table 实际上对 NAxtabs 更健壮,所以我希望这两个结果相同。这两种方法的前提是相同的,但它们处理NAs 的方式似乎不同。

    表格

    您可能只需要知道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)))
    )
    

    (相同的结果)

    【讨论】:

    • 是的,这是真的,我们必须摆脱 NA。 xtabs 方法效果很好,因此您得到了正确的答案。但是没有办法用桌子来做吗?我对这个功能非常熟悉,我想知道是否有任何方法可以做到这一点。
    • 是的。请参阅我的编辑。 table 可以随心所欲,我的 do.call 变体旨在动态化,可能对您的需求过度杀伤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2011-05-22
    • 2020-08-06
    相关资源
    最近更新 更多