将 table 转换为 R 中的数据帧列表

Convert a table into a list of data frames in R

我有一个包含三个变量的数据框:一个分组变量 (Group) 和一个分类变量,指示该组是否是新的 (New) 以及它的条目是否是拖欠的 (Delinquent)。

这里是示例数据:

df <- structure(list(Group = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 5L, 6L, 7L), .Label = c("A", "B", "C", "D", "E", "F", "G"), class = "factor"), New = c(FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE), Delinquent = c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE)), .Names = c("Group", "New", "Delinquent"), class = "data.frame", row.names = c(NA, -14L))
#df

我正在尝试根据是否是新的来计算拖欠组的数量。为此,我在一个简单的数据框上将 table 包裹在 aggregate 周围:

yo <- table(aggregate(Delinquent ~ Group + New, data = df, FUN = max))

产生相当奇怪的输出,class "table"

的一个对象
yo
#, , Delinquent = 0
#
#     New
#Group FALSE TRUE
#    A     0    0
#    B     0    0
#    C     1    0
#    D     0    1
#    E     1    0
#    F     0    1
#    G     0    0
#
#, , Delinquent = 1
#
#     New
#Group FALSE TRUE
#    A     1    0
#    B     0    1
#    C     0    0
#    D     0    0
#    E     0    0
#    F     0    0
#    G     1    0

输出似乎是我需要的,可以根据新的或非新的状态来统计拖欠组的数量。通常,我将 tables 转换为数据帧以直接与数据交互。但是,在这种情况下,我无法与输出的 table 对象进行交互或成功转换它。我尝试通过 as.data.frameas.data.frame.matrix 将其转换为数据框,并通过 as.listas.data.frame.list 将其转换为列表,但转换后的输出似乎不正确。使用 as.data.frame.array 是我能想到的最好的方法,但我期待一个包含两个单独数据框的列表,每个数据框对应一个拖欠状态。有什么建议吗?

as.data.frame.array(yo)
#   FALSE.0 TRUE.0 FALSE.1 TRUE.1
# A       0      0       1      0
# B       0      0       0      1
# C       1      0       0      0
# D       0      1       0      0
# E       1      0       0      0
# F       0      1       0      0
# G       0      0       1      0

你应该使用 as.data.frame.table.

如果你想把所有东西合二为一data.frame:

as.data.frame.table(yo)

   Group   New Delinquent Freq
1      A FALSE          0    0
2      B FALSE          0    0
3      C FALSE          0    1
4      D FALSE          0    0
5      E FALSE          0    1
...

如果像你说的那样你想要 data.frames 的列表:

(yolist <- apply(yo, 3, as.data.frame.table))

$`0`
   Group   New Freq
1      A FALSE    0
2      B FALSE    0
3      C FALSE    1
4      D FALSE    0
5      E FALSE    1
...

$`1`
   Group   New Freq
1      A FALSE    1
2      B FALSE    0
3      C FALSE    0
4      D FALSE    0
5      E FALSE    0
...

sapply(yolist, class)
           0            1
"data.frame" "data.frame"

之所以有效,是因为您的 table 是 3 维数组。上面的行从 table 中用适当的索引切片构造 data.frame。

要从另一个方向接近你的目标(新的或新的拖欠的数量),你也可以使用 plyr 包中的 ddply:

library(plyr)

yo <- ddply(df, .(Group, New, Delinquent), summarize,
             sum_in_group = length(Delinquent==TRUE)
             )

给出:

  Group   New Delinquent sum_in_group
1     A FALSE      FALSE            1
2     A FALSE       TRUE            2
3     B  TRUE      FALSE            1
4     B  TRUE       TRUE            2
5     C FALSE      FALSE            3
6     D  TRUE      FALSE            2
7     E FALSE      FALSE            1
8     F  TRUE      FALSE            1
9     G FALSE       TRUE            1

我知道这不能直接回答您的 table 问题,但我发现这个输出更容易自己处理。

编辑

回应您的评论:类似于

yo <- ddply(df, .(Group, New), summarize,
            Delinquent = max(Delinquent)
);yo

  Group   New Delinquent
1     A FALSE          1
2     B  TRUE          1
3     C FALSE          0
4     D  TRUE          0
5     E FALSE          0
6     F  TRUE          0
7     G FALSE          1

拖欠栏中的 1 表示该组至少拖欠一次。

或者,也许您还需要合规性专栏:

plyr:

library(plyr)
ddply(df, .(Group, New), summarize,
            delinquent = as.numeric(any(Delinquent)), 
            compliant = as.numeric(!any(Delinquent))
) 

dplyr:

library(dplyr)
as.data.frame(df %>% 
  group_by(Group, New) %>%
  summarize(
    delinquent = as.numeric(any(Delinquent)), 
    compliant = as.numeric(!any(Delinquent))
    )
)

双输出:

  Group   New delinquent compliant
1     A FALSE          1         0
2     B  TRUE          1         0
3     C FALSE          0         1
4     D  TRUE          0         1
5     E FALSE          0         1
6     F  TRUE          0         1
7     G FALSE          1         0