2017-05-08 122 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

哦,我正在迴應另一個用戶對我不太瞭解的東西的評論(現在已刪除)。謝謝你澄清! –