Chapter 3 資料物件
{R} 是以物件導向為主的程式語言, 在 {R} 中, 資料或運算指令以具有名稱的 物件 (object), 形式儲存, 資料物件可以是 向量 (vector), 矩陣 (matrix), 陣列 (array), 列表 (Lists), 或 資料框架 (data frames) 等. 在 {R} 中, 資料分析基本上是產生資料物件, 對物件命名, 使用函式對物件運算操作. 透過指令, 很容易地對物件進行統計分析與統計繪圖. 上一章討論向量的基本操作, 本章進一步討論 {R} 的其他多維度資料物件, 包含 矩陣 (matrix), 陣列 (array), 列表 (Lists), 或資料框架 (data frames) 等.
3.1 矩陣物件 Matrix
矩陣
(matrix)
物件由包含相同的元素 (模式, mode) 組成的 \(2\)-維度 (2-dimension) 資料物件,
矩陣具有
維度
(dimension)
之屬性,
可以使用函式 dim()
檢視.
可以將矩陣視為一個向量具二維結構,
也可以將 矩陣 視為一個向量具 \(2\)-維度的陣列 (array).
3.1.1 矩陣函式 matrix()
使用者若要輸入一個簡單的矩陣資料,
列 \(\times\) 欄
(列 \(\times\) 行),
或希望以矩陣形式儲存資料,
可以用 函式
matrix()
.
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
其中引數為
nrow = r
正整數, 設定列數
(row numbers).ncol = c
正整數, 設定欄數
或行數
(column number).byrow = FALSE
: 在 {R} 中的自動設定, 矩陣資料是以欄 (行) 位 (column) 優先填滿. 要改變設定, 可改成byrow = TRUE
.dimnames = obj.list
輸入列表設定列位名與欄位名.
使用函式
dim()
可以回傳具有維度數屬性的資料物件之維度大小.
## numeric
matrix(c(1, 2, 3, 4, 5, 6), nrow = 2) # one row first
x.mat <-
x.mat## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
dim(x.mat)
## [1] 2 3
matrix(c(1, 2, 3, 4, 5, 6), ncol = 2)
y.mat <-
y.mat## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, byrow = T)
z.mat <-
z.mat## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
matrix(c(1, 2, 3, 4, 5, 6), ncol = 2, byrow = T)
p.mat <-
p.mat## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
matrix(c(1:18), nrow = 3)
w.mat <-
w.mat## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 4 7 10 13 16
## [2,] 2 5 8 11 14 17
## [3,] 3 6 9 12 15 18
dim(y.mat)
## [1] 3 2
# character
c("a", "b", "c", "d", "e", "f")
x.vec <-
x.vec## [1] "a" "b" "c" "d" "e" "f"
matrix(x.vec, nrow = 2, ncol = 3) # byrow = F
y.mat <-
y.mat## [,1] [,2] [,3]
## [1,] "a" "c" "e"
## [2,] "b" "d" "f"
matrix(x.vec,
y.mat <-nrow = 2,
ncol = 3,
byrow = T)
y.mat## [,1] [,2] [,3]
## [1,] "a" "b" "c"
## [2,] "d" "e" "f"
dim(y.mat)
## [1] 2 3
# dim
1:10
m.vec.mat <-dim(m.vec.mat) <- c(2, 5)
m.vec.mat## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 3 5 7 9
## [2,] 2 4 6 8 10
dim(m.vec.mat)
## [1] 2 5
3.1.2 矩陣命名 dimnames()
矩陣的命名, 包含欄位名 (column name) 與列位名 (row name),
可以使用函式
dimnames()
分別給予矩陣命名.
可以用函式 dimnames()
同時檢視 matrix 之列位名與欄位名.
若要對讀取或命名矩陣的
列位名
(row name)
或
欄位名
(column name),
也可以用函式指令
rownames()
與
colnames()
.
# dimnames
matrix(1:6, nrow = 2, ncol = 3)
x.mat <-dimnames(x.mat) <- list(c("A1", "A2"),
c("B1", "B2", "B3"))
x.mat## B1 B2 B3
## A1 1 3 5
## A2 2 4 6
dim(x.mat)
## [1] 2 3
dimnames(x.mat)
## [[1]]
## [1] "A1" "A2"
##
## [[2]]
## [1] "B1" "B2" "B3"
rownames(x.mat)
## [1] "A1" "A2"
colnames(x.mat)
## [1] "B1" "B2" "B3"
#
matrix(
m.mat <-c(1, 2, 3, 11, 12, 13),
nrow = 2,
ncol = 3,
byrow = TRUE,
dimnames = list(c("row1", "row2"),
c("C1", "C2", "C3"))
)
m.mat## C1 C2 C3
## row1 1 2 3
## row2 11 12 13
dim(m.mat)
## [1] 2 3
dimnames(m.mat)
## [[1]]
## [1] "row1" "row2"
##
## [[2]]
## [1] "C1" "C2" "C3"
rownames(m.mat)
## [1] "row1" "row2"
colnames(m.mat)
## [1] "C1" "C2" "C3"
3.2 矩陣的下標與索引 Matrix Index
矩陣的
下標
或
索引
(index)
操作,
如同向量的下標與索引操作,
矩陣具有 \(2\)-維度下標向量,
個別下標向量可以輸入正整數, 負數, 整數向量, 欄位名等等.
例如, 可以使用
中括號
matrix.name[i, j]
可存取矩陣中的第 \([i, j]\) 元素;
matrix.name[i, ]
可存取矩陣中的第 \(i\) 列 (\(i\)th row),
matrix.name[ , j]
可存取矩陣中的第 \(j\) 欄 (\(i\)th column).
在 {R} 中顯示矩陣物件,
[m, ]
出現在某特定元素左方時,
表示某特定元素在該矩陣物件之第 \(m\) 列 (row) 的位置;
[ , n]
出現在某特定元素上方時,
表示某特定元素在該矩陣物件之第 \(n\) 欄 (column) 的位置.
## matrix index
matrix(c(1:12), 3, 4)
x.mat <-
x.mat## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
2, 3] <- 30
x.mat[
x.mat## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 30 11
## [3,] 3 6 9 12
2,]
x.mat[## [1] 2 5 30 11
3]
x.mat[, ## [1] 7 30 9
c(1, 3), c(2, 4)]
x.mat[## [,1] [,2]
## [1,] 4 10
## [2,] 6 12
#
matrix(
m.mat <-c(1, 2, 3, 11, 12, 13),
nrow = 2,
ncol = 3,
byrow = TRUE,
dimnames = list(c("row1", "row2"),
c("C1", "C2", "C3"))
)
m.mat## C1 C2 C3
## row1 1 2 3
## row2 11 12 13
c("C1", "C2")]
m.mat[, ## C1 C2
## row1 1 2
## row2 11 12
c("row2"),]
m.mat[## C1 C2 C3
## 11 12 13
c("row1"), c("C1", "C3")]
m.mat[## C1 C3
## 1 3
矩陣下標與索引若僅選取 1 列 或 1 欄,
則會維度縮減產生向量, 若仍要產生矩陣, 則可加入參數
drop = FALSE
.
## dimension reduction
matrix(1:8, nrow = 2, ncol = 4)
x.mat <-1,] # reduces to a vector
x.mat[## [1] 1 3 5 7
1, , drop = FALSE] # remains as a matrix
x.mat[## [,1] [,2] [,3] [,4]
## [1,] 1 3 5 7
3.3 向量與矩陣的合併: rbind() 與 cbind()
在 {R} 中向量並不具有 沒有維度 (no dimension), 例如, 向量可以視為 \(1 \times k\) 的 向量/矩陣, 也可以視為 \(k \times 1\) 的 向量/矩陣, 但是, 當 向量 與 其它 向量/矩陣 進行運算時, 向量 會受到與其進行運算的矩陣物件影響, {R} 如何處理 向量 與 其它 向量/矩陣 進行運算並沒有清楚的規則, 有時視為 \(1 \times k\) 若任由 {R} 的內在設定, 則將會有意想不到的運算結果, 因此在進行線性代數相關的計算, 若要避免混淆與錯誤, 初學者可將數學的 \(1\)-維度 \(k\)-個元素的向量, 重新定義成 {R} 的 \(1 \times k\) 的矩陣 或是 \(k \times 1\) 的矩陣, 然後再進行線性代數相關的計算. 同樣, 合併不同 列位數 (row number) 或 欄位數 (column number) 的向量或矩陣, 因為使用 recycle 原則必須小心.
## matrix cbind() and rbind()
c(1, 2, 3)
x.vec <- c(8, 9, 10)
y.vec <-rbind(x.vec, y.vec) # vector as row vector
## [,1] [,2] [,3]
## x.vec 1 2 3
## y.vec 8 9 10
cbind(x.vec, y.vec) # vector as col vector
## x.vec y.vec
## [1,] 1 8
## [2,] 2 9
## [3,] 3 10
#
matrix(c(11:16), 2, 3)
x.mat <-rbind(x.mat, x.vec) # vector as row vector
## [,1] [,2] [,3]
## 11 13 15
## 12 14 16
## x.vec 1 2 3
cbind(x.mat, y.vec) # warning
## Warning in cbind(x.mat, y.vec): number of rows of result is not a multiple of vector length (arg 2)
## y.vec
## [1,] 11 13 15 8
## [2,] 12 14 16 9
#
c(1, 2)
x.vec <- c(8, 9)
y.vec <-rbind(x.vec, y.vec) # vector as row vector
## [,1] [,2]
## x.vec 1 2
## y.vec 8 9
cbind(x.vec, y.vec) # vector as col vector
## x.vec y.vec
## [1,] 1 8
## [2,] 2 9
#
matrix(c(11:14), 2, 2)
x.mat <- rbind(x.mat, x.vec) # vector as row vector
z.mat <-
z.mat## [,1] [,2]
## 11 13
## 12 14
## x.vec 1 2
cbind(x.mat, y.vec) # vector as col vector
## y.vec
## [1,] 11 13 8
## [2,] 12 14 9
rbind(z.mat, y.vec) # vector as row vector
## [,1] [,2]
## 11 13
## 12 14
## x.vec 1 2
## y.vec 8 9
cbind(z.mat, y.vec) # warning
## Warning in cbind(z.mat, y.vec): number of rows of result is not a multiple of vector length (arg 2)
## y.vec
## 11 13 8
## 12 14 9
## x.vec 1 2 8
3.4 陣列物件 Array
陣列
(array)
物件也由包含相同模式 (mode) 的元素組成的 \(p\)-維資料物件,
也可以將陣列視為一個向量具 \(p\)-維結構.
使用函式
array()
產生陣列.
{R} 顯示 \(3\)-維陣列物件 \(m \times n \times k\),
[m, , ]
出現在某特定元素之前時,
表示某特定元素在該陣列物件之第 \(m\) 列 (row) 的位置;
[ , n, ]
出現在某特定元素之前時,
表示某特定元素在該陣列物件之第 \(n\) 欄 (column) 的位置, 依此類推.
[ , , k]
表示 \(3\)-維陣列的第 1, 2-維度之矩陣.
陣列的命名, 與矩陣類似,
可以使用函式
dimnames()
分別給予陣列命名.
可以用函式 dimnames()
同時檢視 array 之列位名與欄位名.
陣列的
下標 或
索引
(index)
之操作,
與矩陣下標或索引的操作類似,
使用
中括號 ([i, j, k]
).
若要對讀取或命名陣列的第 1 維度
(列位名,
row name)
{或
第 2 維度
(欄位名,
column name**),
也可以用函式指令
rownames()
與
colnames()
.
## array()
1:24
a.vec <-
a.vec## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
array(a.vec, dim = c(4, 3, 2),
b.array <-dimnames = list(c("x1", "x2", "x3", "x4"),
c("y1", "y2", "y3"),
c("z1", "z2")))
b.array## , , z1
##
## y1 y2 y3
## x1 1 5 9
## x2 2 6 10
## x3 3 7 11
## x4 4 8 12
##
## , , z2
##
## y1 y2 y3
## x1 13 17 21
## x2 14 18 22
## x3 15 19 23
## x4 16 20 24
mode(b.array)
## [1] "numeric"
dim(b.array)
## [1] 4 3 2
length(b.array)
## [1] 24
dimnames(b.array)
## [[1]]
## [1] "x1" "x2" "x3" "x4"
##
## [[2]]
## [1] "y1" "y2" "y3"
##
## [[3]]
## [1] "z1" "z2"
rownames(b.array)
## [1] "x1" "x2" "x3" "x4"
colnames(b.array)
## [1] "y1" "y2" "y3"
# array index
a.vec## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
array(a.vec, dim = c(4, 3, 2),
b.array <-dimnames = list(c("x1", "x2", "x3", "x4"),
c("y1", "y2", "y3"),
c("z1", "z2")))
b.array## , , z1
##
## y1 y2 y3
## x1 1 5 9
## x2 2 6 10
## x3 3 7 11
## x4 4 8 12
##
## , , z2
##
## y1 y2 y3
## x1 13 17 21
## x2 14 18 22
## x3 15 19 23
## x4 16 20 24
3, 2, 1]
b.array[## [1] 7
4, 3, 2]
b.array[## [1] 24
2, c(1, 3), 1]
b.array[## y1 y3
## 2 10
3, c(2, 3), 1]
b.array[## y2 y3
## 7 11
2, ,]
b.array[## z1 z2
## y1 2 14
## y2 6 18
## y3 10 22
2,]
b.array[, ## z1 z2
## x1 5 17
## x2 6 18
## x3 7 19
## x4 8 20
2]
b.array[, , ## y1 y2 y3
## x1 13 17 21
## x2 14 18 22
## x3 15 19 23
## x4 16 20 24
3.5 列表物件 List
列表 (list) 是一個特殊的 向量, 這特殊的向量中的元素是物件. 列表物件 元素的模式 (mode) 是 複雜模式 (complex mode) 列表物件是由資料物件有順序組成, 列表物中的 ``元素’’, 稱作 成份 (component), 是物件本身, 列表物中的成份是有順序的 (order sequence), 成份物件的元素模式, 沒有任合限制, 每一個別成份的物件之原型模式可以不相同. 列表的產生通常先決定每一個成分的物件, 然後再組合成列表.
3.5.1 列表函式 list()
使用函式
list()
將個別成分組成列表.
{R} 許多統計分析的結果常常包含
不同物件, 例如, 迴歸模型分析包含 參數估計,
變異數分析, 預測值與殘差,
每一成分的長度與模式不一,
模型分析產生的結果最後多以列表儲存.
## list()
## list w/o component names
1:4
x.vec <- c("Male", "Female")
y.vec <- matrix(1:9, nrow = 3, ncol = 3)
z.mat <- list(x.vec, y.vec, z.mat)
xyz.list <-
xyz.list## [[1]]
## [1] 1 2 3 4
##
## [[2]]
## [1] "Male" "Female"
##
## [[3]]
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
mode(xyz.list)
## [1] "list"
length(xyz.list)
## [1] 3
dim(xyz.list)
## NULL
names(xyz.list)
## NULL
class(xyz.list)
## [1] "list"
## list w/ component names
c(1, 3, 6)
x.num <- c("chocolate", "vanilla", "strawberry")
y.str <- list(x.num.var = x.num, y.str.var = y.str)
xy.list <-
xy.list## $x.num.var
## [1] 1 3 6
##
## $y.str.var
## [1] "chocolate" "vanilla" "strawberry"
# list = data matrix
c(1, 2, 3, 4)
id.vec <- c(35, 55, 45, 25)
age.vec <- c("Male", "Male", "Female", "Female")
sex.vec <- c("Yes", "No", "No", "Yes")
disease.vec <- list(
x.list <-id = id.vec,
age = age.vec,
sex = sex.vec,
disease = disease.vec
)
x.list## $id
## [1] 1 2 3 4
##
## $age
## [1] 35 55 45 25
##
## $sex
## [1] "Male" "Male" "Female" "Female"
##
## $disease
## [1] "Yes" "No" "No" "Yes"
3.5.2 列表的下標與索引 List Index
列表物件的
下標
或
索引
之操作,
與矩陣 或 陣列之操作有所不同,
若一個名字為 List.Name
的列表物件,
要取得 list 其中的 第 i.number
成份,
須使用
List.Name[[i]]
.
注意, 在列表物件的下標操作,
[[i.number]]
與 [i.number]
是不一樣的.
## list index
## list w/o component names
1:4
x.vec <- c("Male", "Female")
y.vec <- matrix(1:9, nrow = 3, ncol = 3)
z.mat <- list(x.vec, y.vec, z.mat)
xyz.list <-
xyz.list## [[1]]
## [1] 1 2 3 4
##
## [[2]]
## [1] "Male" "Female"
##
## [[3]]
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
1]
xyz.list[## [[1]]
## [1] 1 2 3 4
1]]
xyz.list[[## [1] 1 2 3 4
2]
xyz.list[## [[1]]
## [1] "Male" "Female"
3]]
xyz.list[[## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
3]
xyz.list[## [[1]]
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
若列表中的 成份 (component)
有另外命名為 comp.name
,
可以使用函式
List.Name\$comp.name
取得成份名字,
會與使用函式
List.Name[[comp.name]]
取得相同結果.
在
List.Name$comp.name
或
List.Name[[comp.name]]
加上 中括號 等,
可以取得
List.Name$comp.name
中的元素.
[[i.number]]
可以適用在計算指標,
但 $ 僅能使用在有設定的成分名的列表.
若列表的單一成份內有多維度物件
可使用巢狀下標取出資料.
# list w/ component names
1:4
x.vec <- c("Male", "Female")
y.vec <- matrix(1:9, nrow = 3, ncol = 3)
z.mat <- list(class = x.vec,
xyz.list <-gender = y.vec,
score = z.mat)
xyz.list## $class
## [1] 1 2 3 4
##
## $gender
## [1] "Male" "Female"
##
## $score
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
$class
xyz.list## [1] 1 2 3 4
"class"]]
xyz.list[[## [1] 1 2 3 4
"class"]][2]
xyz.list[[## [1] 2
#
$gender
xyz.list## [1] "Male" "Female"
"gender"]][1]
xyz.list[[## [1] "Male"
#
$score
xyz.list## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
"score"]][2, 3]
xyz.list[[## [1] 8
3.6 資料框架 Data Frame
一組資料通常包含數字與文字,
在 {R} 中的向量與矩陣物件,
只允許相同的變數型式,
若要同時存入數字變數與文字變數,
{R} 可以使用
列表
(list)
與 函式指令
list()
,
列表資料內可包含不同屬性的變數值.
資料框架 (data frame) 是列表物件的一種特殊情境. 在資料框架內的每個變數之觀測值數目 (向量長度) 都相等, 類似矩陣型式, 但是每個變數的變數值不一定是相同的模式, 因此資料框架對統計人員而言, 常稱為 資料矩陣 (data matrix), 是一般統計資料分析常用的形式. 注意: {R} 資料框架物件操作類似 {R} 矩陣物件, 但 {R} 資料框架物件本質上為 {R} 列表物件.
3.7 資料框架函式 data.frame()
{R} 可以使用函式
data.frame()
將資料儲存成資料框架物件.
輸入時須注意每個變數之觀測值數目 (向量長度) 都必須相等,
若有缺失值, 須先將缺失值符號輸入在向量內.
## data frame
c(1, 2, 3, 4)
id.vec <- c(35, 55, 45, 25)
age.vec <- c("Male", "Male", "Female", "Female")
sex.vec <- c("Yes", "No", "No", "Yes")
disease.vec <- data.frame(
x.df <-id = id.vec,
age = age.vec,
sex = sex.vec,
disease = disease.vec
)mode(x.df)
## [1] "list"
class(x.df)
## [1] "data.frame"
x.df## id age sex disease
## 1 1 35 Male Yes
## 2 2 55 Male No
## 3 3 45 Female No
## 4 4 25 Female Yes
$age
x.df## [1] 35 55 45 25
$disease
x.df## [1] "Yes" "No" "No" "Yes"
3.7.1 資料框架的下標與索引 Data Frame Index
資料框架的
下標
或
索引
(index)
操作,
如同矩陣的下標與索引操作,
可以輸入正整數, 負數, 整數向量, 欄位名等等.
矩陣具有 2-維度下標向量,
例如, 可以使用
中括號
dataframe.name[i, j]
可存取資料框中的第 \([i, j]\) 元素;
dataframe.name[i, ]
可存取資料框中的第 \(i\) 列 (\(i\)th row),
dataframe.name[ , j]
可存取資料框中的第 \(j\) 欄 (\(i\)th column).
資料框架是列表的特例,
因此資料框架的
下標
或
索引
(index)
操作,
也可如同列表的下標與索引操作.
若一個名為 data.Name
的資料框架,
要取的其中的 第 `i.number'' 變數 (成份), 須使用
data.Name[[i]]. 注意, 在資料框架物件的下標操作,
[[i.number]]與
[i.number]是不一樣的. 若資料框架中的變數命名為
variable.name, 可以使用函式
dataframe.Name\(variable.name` 取得變數資料, 會與使用函式 `dataframe.Name[[variable.name]] 取得相同結果. 在 `dataframe.Name\)variable.name或
dataframe.Name[[variable.name]]加上 **中括號**
[k]等, 可以取得
dataframe.Name$variable.name中的元素.
[[i.number]]` 可以適用在計算指標,
但 $ 僅能使用在有設定變數名的資料框架.
## data frame index
data(Puromycin)
Puromycin## conc rate state
## 1 0.02 76 treated
## 2 0.02 47 treated
## 3 0.06 97 treated
## 4 0.06 107 treated
## 5 0.11 123 treated
## 6 0.11 139 treated
## 7 0.22 159 treated
## 8 0.22 152 treated
## 9 0.56 191 treated
## 10 0.56 201 treated
## 11 1.10 207 treated
## 12 1.10 200 treated
## 13 0.02 67 untreated
## 14 0.02 51 untreated
## 15 0.06 84 untreated
## 16 0.06 86 untreated
## 17 0.11 98 untreated
## 18 0.11 115 untreated
## 19 0.22 131 untreated
## 20 0.22 124 untreated
## 21 0.56 144 untreated
## 22 0.56 158 untreated
## 23 1.10 160 untreated
$rate
Puromycin## [1] 76 47 97 107 123 139 159 152 191 201 207 200 67 51 84 86 98 115 131 124 144 158 160
$state
Puromycin## [1] treated treated treated treated treated treated treated treated treated treated
## [11] treated treated untreated untreated untreated untreated untreated untreated untreated untreated
## [21] untreated untreated untreated
## Levels: treated untreated
1]
Puromycin[## conc
## 1 0.02
## 2 0.02
## 3 0.06
## 4 0.06
## 5 0.11
## 6 0.11
## 7 0.22
## 8 0.22
## 9 0.56
## 10 0.56
## 11 1.10
## 12 1.10
## 13 0.02
## 14 0.02
## 15 0.06
## 16 0.06
## 17 0.11
## 18 0.11
## 19 0.22
## 20 0.22
## 21 0.56
## 22 0.56
## 23 1.10
1][[1]]
Puromycin[## [1] 0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22 0.56 0.56 1.10 1.10 0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22
## [21] 0.56 0.56 1.10
$state[1:3]
Puromycin## [1] treated treated treated
## Levels: treated untreated
1:3, 1:2]
Puromycin[## conc rate
## 1 0.02 76
## 2 0.02 47
## 3 0.06 97