将 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.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
你应该使用 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
我有一个包含三个变量的数据框:一个分组变量 (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.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
你应该使用 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