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

时间:2017-05-08 22:46:01

标签: r list dataframe aggregate tabular

我有一个包含三个变量的数据框:分组变量(组)和分类变量,指示组是否为新(新)以及其条目是否为延误(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))

产生相当奇怪的输出,类#34; table&#34;

的对象
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

输出似乎是我需要根据他们的状态计算拖欠组的数量。通常,我将表转换为数据帧以直接与数据交互。但是,在这种情况下,我无法与输出的表对象进行交互或成功转换它。我尝试通过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

2 个答案:

答案 0 :(得分:3)

您应该使用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"

这是有效的,因为你的表是三维数组。上面的行从一个按适当索引切片的表构造一个data.frame。

答案 1 :(得分:1)

要从另一个大头钉中接近你的目标(新的或非新的违约数量),你也可以使用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

我知道这不会直接回答你的表格问题,但我觉得这个输出更容易处理我自己。

修改

回应你的评论:类似

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