Saturday, October 04, 2014

R データフレーム操作 メモ

データフレーム操作を良くするのでメモです

#######------------------------------------------------------------------------######
# make test data frame  データフレーム作成 
Sex = c("M", "M", "F", "F")
Age = c(20, 19, 18, 20)
height = c(170, 175, 160, 165)
weight = c(65, 75, 58, 60)
data = data.frame(Sex, Age, height, weight)
data                         #view check 確認  view check

rownames(data)               # row name  行名(row=行)  
colnames(data)               # col name   列名(column=列)

nrow(data)                   #how many rows 行数を調べる(row)
ncol(data)                   #how many cols 列数を調べる(col)

is.data.frame(data)          #judge Data Frame データフレームか調べる TRUE or FALSE

############  sampling col  列(col)を取り出す
data$height                  #データフレーム$列名 ベクトルで返る
data[ ,3]                    #データフレーム[,列番号] ベクトルで返る
data[ ,"height"]             #データフレーム[,"列名"] ベクトルで返る

############ sampling row     行(row)を取り出す
data[2, ]                     #データフレーム[行番号,] ベクトルで返る
data["2", ]                   #データフレーム[行名,] ベクトルで返る

########## sampling more than one col or row 複数の列・行を取り出す
data[ ,c(1, 3)]               #データフレーム[,c(列番号, 列番号)] ベクトルで返る
data[ ,c("Sex","height")]     #データフレーム[,c(列名, 列名)] ベクトルで返る

data[c(2, 4), ]              #データフレーム[,c(行番号, 行番号)] ベクトルで返る
data[c("2", "4"), ]          #データフレーム[,c(行名, 行名)] ベクトルで返る

# pickup match data's rows 条件に合う行データのみ取り出す
data$height >= 170        # TRUE FALSE で返す
data[c(T, T, F, F),  ]       # 値を取り出す
data[data$height>=170, ]        # 直接的に取り出すには これが最適 direct formula 


# データフレームに列を付け加える ##################################
data1<- data                #データフレームの複製
data1["new"] <- c("new", "new", "new", "old") #データフレームの無い列を指定して代入
data1                       #確認

#データフレームに transform(DF, 列名=ベクトル) 関数を使う場合
data2<- data                #データフレームの複製
data2<- transform(data2, eye=c("black", "brown", "blue", "brown"))
data2

#データフレームに cbind(DF, ベクトル) 列名調整必要
data3<- data                #データフレームの複製
data3<- cbind(data3, c(5, 3, 4, 2))
names(data3) <- c("Sex","Age","height","weight","point")         # 変数ラベルを調整
data3

# データフレームに 新しい列を計算で作る BMI=体重(kg)/身長(m)*身長(m) round(x,桁)
transform(data, BMI=round(data$weight/(data$height/100)^2, 1))

#データフレームにcbind()でデータフレームをつなぐ方法
data                        #確認
y <- data.frame(c=c(TRUE,TRUE,FALSE,FALSE)) #データフレーム作成
data4<- cbind(data, y)
data4

#####--データフレームを列の値をキーに繋ぐ--------------------------------------------
# データフレーム born を作る
name<- c("Moe","Larry","Curly","Harry")
year.born<- c(1887, 1902, 1903, 1964)
place.born<- c("Bensonhurst","Philadelphia","Brooklyn","Moscow")
born<- data.frame(name, year.born, place.born)
born
# データフレーム died を作る
name<- c("Curly","Moe","Larry") #繋げる
year.died<- c(1952, 1975, 1975)
died<-data.frame(name, year.died)
died

merge(born, died, by="name")    # 2つのデータフレームを name を使って対応する行を結合