2017-05-08 125 views
1

我有一个包含三个变量的数据框:分组变量(Group)和分类变量,用于指示组是新的(新),并且其条目是拖欠的(拖欠) 。将表转换为R中的数据框列表

这里有样本数据

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 

我想算拖欠组数,由它们是否是新的或没有。要做到这一点,我一个简单的数据帧上缠aggregatetable

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

它产生相当奇数输出,类“表”的一个目的

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 

回答

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" 

这工作,因为你的表是3维数组。上面的行从适当的索引切片的表中构造了一个data.frame。

1

接近你的目标,从另一种策略(通过新的或不违法的数量),你也可以ddply从plyr包中使用:

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 
+0

咦。我使用问题本身创建的'yo'获得不同的输出 - 我在那里做错了什么?我在'data.table'中不太熟悉,所以我很抱歉如果我没有正确理解输出。 –

+0

感谢您的替代策略。至于没有像原来的帖子那样获得相同的'yo',为了澄清,'data.table'包没有涉及。它使用了来自base R的'table'。无论采用哪种方式,您的'plyr'输出都会生成我正在寻找的内容,所以非常感谢。 – coip

+0

哦,我正在回应另一个用户对我不太了解的东西的评论(现在已删除)。谢谢你澄清! –