我有一个包含三个变量的数据框:分组变量(组)和分类变量,指示组是否为新(新)以及其条目是否为延误(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.frame
和as.data.frame.matrix
将其转换为数据框,并通过as.list
和as.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
答案 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