問題
你想要在多種情況的一個(gè)數(shù)據(jù)框见转、每種情況類型計(jì)數(shù)的數(shù)據(jù)框以及一個(gè)列聯(lián)表之間轉(zhuǎn)換命雀。
方案
這里有3種數(shù)據(jù)結(jié)構(gòu)代表相同的信息,但是是以不同的形式:
-
cases
: 每一行代表一個(gè)情況的數(shù)據(jù)框 -
ctable
: 一個(gè)列聯(lián)表 -
counts
: 計(jì)數(shù)的數(shù)據(jù)框斩箫,每行代表每一種組合的數(shù)目
# 每一行代表一種情況
cases <- data.frame(
Sex=c("M", "M", "F", "F", "F"),
Color=c("brown", "blue", "brown", "brown", "brown")
)
cases
#> Sex Color
#> 1 M brown
#> 2 M blue
#> 3 F brown
#> 4 F brown
#> 5 F brown
# 一個(gè)列聯(lián)表
ctable <- table(cases)
ctable
#> Color
#> Sex blue brown
#> F 0 3
#> M 1 1
# 一個(gè)每種組合計(jì)數(shù)的表格
counts <- data.frame(
Sex=c("F", "M", "F", "M"),
Color=c("blue", "blue", "brown", "brown"),
Freq=c(0, 1, 3, 1)
)
counts
#> Sex Color Freq
#> 1 F blue 0
#> 2 M blue 1
#> 3 F brown 3
#> 4 M brown 1
將情況記錄轉(zhuǎn)為列聯(lián)表
將情況記錄轉(zhuǎn)為列聯(lián)表(上面已經(jīng)展示了):
# Cases to Table
ctable <- table(cases)
ctable
#> Color
#> Sex blue brown
#> F 0 3
#> M 1 1
# 如果你使用兩個(gè)向量調(diào)用table函數(shù)吏砂,它將不會(huì)給維度添加名字(Sex和Color)
table(cases$Sex, cases$Color)
#>
#> blue brown
#> F 0 3
#> M 1 1
# 維度名可以通過`dnn`選項(xiàng)手動(dòng)指定
table(cases$Sex, cases$Color, dnn=c("Sex","Color"))
#> Color
#> Sex blue brown
#> F 0 3
#> M 1 1
將情況記錄轉(zhuǎn)為計(jì)數(shù)
它可以用一個(gè)數(shù)據(jù)框代表每一種組合的計(jì)數(shù)。注意它被轉(zhuǎn)換并存儲(chǔ)在countdf
變量中:
# Cases to Counts
countdf <- as.data.frame(table(cases))
countdf
#> Sex Color Freq
#> 1 F blue 0
#> 2 M blue 1
#> 3 F brown 3
#> 4 M brown 1
列聯(lián)表轉(zhuǎn)為情況記錄
countsToCases(as.data.frame(ctable))
#> Sex Color
#> 2 M blue
#> 3 F brown
#> 3.1 F brown
#> 3.2 F brown
#> 4 M brown
注意countsToCases函數(shù)定義在下面(文章最后)乘客。
列聯(lián)表轉(zhuǎn)為計(jì)數(shù)
as.data.frame(ctable)
#> Sex Color Freq
#> 1 F blue 0
#> 2 M blue 1
#> 3 F brown 3
#> 4 M brown 1
(從這里我們可以看到上一個(gè)代碼的中間效果)
計(jì)數(shù)轉(zhuǎn)為情況記錄
countsToCases(countdf)
#> Sex Color
#> 2 M blue
#> 3 F brown
#> 3.1 F brown
#> 3.2 F brown
#> 4 M brown
這相當(dāng)于是列聯(lián)表轉(zhuǎn)為情況記錄的第二步狐血。
計(jì)數(shù)轉(zhuǎn)為列聯(lián)表
xtabs(Freq ~ Sex+Color, data=countdf)
#> Color
#> Sex blue brown
#> F 0 3
#> M 1 1
countsToCases()
函數(shù)
這個(gè)函數(shù)使用在上面的例子中:
# Convert from data frame of counts to data frame of cases.
# `countcol` is the name of the column containing the counts
countsToCases <- function(x, countcol = "Freq") {
# Get the row indices to pull from x
idx <- rep.int(seq_len(nrow(x)), x[[countcol]])
# Drop count column
x[[countcol]] <- NULL
# Get the rows from x
x[idx, ]
}
原文鏈接:http://www.cookbook-r.com/Manipulating_data/Converting_between_data_frames_and_contingency_tables/