データを結合してまとめるコマンドの紹介です。c、cbind、rbind、data.frame、listコマンドです。個人的にはデータの数や元のclassを保持しまとめることができるlistコマンドがオススメです。
classが異なるデータをまとめると、c、cbind、rbindではclassが変わってしまいます。大まかなclass優先順位は「character > numeric > integer」です。
実行コマンドはR version 4.1.2で確認しています。
実行コマンド
詳細はコメント、コマンドのヘルプを確認してください。
###データ例の作成#####
#数値データの例
#実数
NumData1 <- c(0.1, 0.001, 0.0000000001)
#クラスの確認
class(NumData1)
[1] "numeric"
#整数
IntData2 <- 1:30
#クラスの確認
class(IntData2)
[1] "integer"
#文字データの例
CharData <- c("か", "ら", "だ", "に", "い", "い", "も", "の")
#クラスの確認
class(CharData)
[1] "character"
#因子データの例
FacData <- factor(CharData,
levels = unique(CharData))
#クラスの確認
class(FacData)
[1] "factor"
########
#cコマンドで結合
#文字列があると数字も文字列になる
CTest <- c(NumData1, IntData2, CharData, FacData)
#classの確認
class(CTest)
[1] "character"
#内容の確認
CTest
[1] "0.1" "0.001" "1e-10" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
[14] "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23"
[27] "24" "25" "26" "27" "28" "29" "30" "か" "ら" "だ" "に" "い" "い"
[40] "も" "の" "1" "2" "3" "4" "5" "5" "6" "7"
#文字列がない場合は数字が優先(numeric > integer)
#因子データは因子水準になる
CTest <- c(NumData1, IntData2, FacData)
#classの確認
class(CTest)
[1] "numeric"
#内容の確認
CTest
[1] 1.0e-01 1.0e-03 1.0e-10 1.0e+00 2.0e+00 3.0e+00 4.0e+00 5.0e+00 6.0e+00 7.0e+00 8.0e+00 9.0e+00 1.0e+01
[14] 1.1e+01 1.2e+01 1.3e+01 1.4e+01 1.5e+01 1.6e+01 1.7e+01 1.8e+01 1.9e+01 2.0e+01 2.1e+01 2.2e+01 2.3e+01
[27] 2.4e+01 2.5e+01 2.6e+01 2.7e+01 2.8e+01 2.9e+01 3.0e+01 1.0e+00 2.0e+00 3.0e+00 4.0e+00 5.0e+00 5.0e+00
[40] 6.0e+00 7.0e+00
#cbindで結合(rbindも結合方向が違うだけで同じ)
#長さが異なるデータは一番長いデータが優先される
#足りないデータは繰り返しで補完されます
CBindTest <- cbind(NumData1, IntData2, CharData, FacData)
Warning message:
In cbind(NumData1, IntData2, CharData, FacData) :
number of rows of result is not a multiple of vector length (arg 3)
#classの確認
class(CBindTest)
[1] "matrix"
#内容の確認
CBindTest
NumData1 IntData2 CharData FacData
[1,] "0.1" "1" "か" "1"
[2,] "0.001" "2" "ら" "2"
#省略
[28,] "0.1" "28" "に" "4"
[29,] "0.001" "29" "い" "5"
[30,] "1e-10" "30" "い" "5"
#data.frameでデータを結合
#列数が異なるとエラーで結合ができない
data.frame(NumData1, IntData2, CharData, FacData)
Error in data.frame(NumData1, IntData2, CharData, FacData) :
引数に異なる列数のデータフレームが含まれています: 3, 30, 8
#listで結合
#元のclassが保持されます,データ数,classが違っても大丈夫
ListTest <- list(NumData1, IntData2, CharData, FacData)
#classの確認
class(ListTest)
#構造の確認
str(ListTest)
List of 4
$ : num [1:3] 1e-01 1e-03 1e-10
$ : int [1:30] 1 2 3 4 5 6 7 8 9 10 ...
$ : chr [1:8] "か" "ら" "だ" "に" ...
$ : Factor w/ 7 levels "か","ら","だ",..: 1 2 3 4 5 5 6 7
#listの連結:cコマンドを使います
ListTest2 <- list("karada-good.net")
c(ListTest, ListTest2)
[[1]]
[1] 1e-01 1e-03 1e-10
[[2]]
[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 25 26 27 28 29 30
[[3]]
[1] "か" "ら" "だ" "に" "い" "い" "も" "の"
[[4]]
[1] か ら だ に い い も の
Levels: か ら だ に い も の
[[5]]
[1] "karada-good.net"
#参考:listのデータを取り出す
#[[]]で指定するとオリジナルのデータが取り出せます
GetData <- ListTest[[3]]
class(GetData)
[1] "character"
GetData
[1] "か" "ら" "だ" "に" "い" "い" "も" "の"
##[]で指定するとlistです
GetData <- ListTest[3]
class(GetData)
[1] "list"
GetData
[1] "か" "ら" "だ" "に" "い" "い" "も" "の"
少しでも、あなたの解析が楽になりますように!!