分析資料前常常需要再次整理資料,方便日後做分析,整理資料第一步往往是將資料的調整值經過一些調整
library(dplyr)
data <- iris # 使用 R 內建的資料。
head(data)
data$Sepal.Length <- ifelse(data$Sepal.Length > 5, 1,2) # Sepal.Length 如果大於 5 會變成 1,不會就會變成 2
data$Species <- ifelse(data$Species %in% "setosa", "IsSetosa","Notsetosa") # %in% 代表有包含到的概念
head(data)
data <- iris # 使用 R 內建的資料。
iris[1:3,] ##第1~3列Row,所有的行Column
iris[,"Species"] ##所有的列Row,名稱為Species的行Column
iris[1:10,c(T,F,T,F,T)] ##第1~10列Row,第1,3,5行Column (TRUE)
# Row的篩選可使用subset()函數
subset(iris,Species=="virginica") ##Species等於"virginica"的列Row,所有的行Column
knitr::kable(iris[grepl("color",iris$Species),]) ##Species包含"color"的列,所有的行
使用subset()函式進行資料分割
subset(data, Sepal.Length > 5) # 只會出現 Sepal.Length > 5 的資料
subset(data, Sepal.Length == 5,select = c("Sepal.Length","Species")) # 只會出現 Sepal.Length 等於 5 的資料,且欄位只會出現 Sepal.Length 和 Species
subset(data, Sepal.Length > 5,select = - Sepal.Length) # selct = 負的代表不要出現的欄位
如需對資料框做排序,可使用order()函數,order()函數可回傳由小到大之元素位置
order(iris$Sepal.Length)
#回傳的第一個位置為14,表示iris$Sepal.Length中,數值最小的元素為第14個元素。
iris$Sepal.Length[14]
head(iris[order(iris$Sepal.Length),]) ##依照Sepal.Length欄位數值大小排序後的前六筆資料
order(iris$Sepal.Length,decreasing = T)
#表示iris$Sepal.Length中,數值最大的元素為第132個元素。
iris$Sepal.Length[132]
head(iris[order(iris$Sepal.Length,decreasing = T),]) ##改為由大到小排序的前六筆資料
irisAdd<-rbind(iris, #資料框
c(1,1,1,1,"versicolor") #在最尾巴新增一列
)
tail(irisAdd)
irisAdd<-cbind(iris, #資料框
rep("Add",nrow(iris)) #新增一行
)
tail(irisAdd)
library(reshape2)
library("tidyr")
#隨便建一個資料集
mydata<-data.frame(
Name = c("蘋果","谷歌","臉書","亞馬遜","騰訊"),
Company = c("Apple","Google","Facebook","Amozon","Tencent"),
Sale2013 = c(5000,3500,2300,2100,3100),
Sale2014 = c(5050,3800,2900,2500,3300),
Sale2015 = c(5050,3800,2900,2500,3300),
Sale2016 = c(5050,3800,2900,2500,3300)
)
mydata
mydata1<-melt(
mydata, #待轉換的數據集名稱
id.vars=c("Company","Name"), #要保留的主字段
variable.name="Year", #轉換後的分類字段名稱(維度)
value.name="Sale" #轉換後的度量值名稱
)
mydata1
spread(
data=mydata1, #帶轉換長數據框名稱
key=Year, #帶擴寬的類別變量(編程添加列名稱)
value=Sale) #帶擴寬的度量值 (編程添加列度量值)