Rで解析:データを結合してまとめるコマンド

Rの解析に役に立つ記事
スポンサーリンク

データを結合してまとめるコマンドの紹介です。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] "か" "ら" "だ" "に" "い" "い" "も" "の"

少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました