R提高篇(三): 數據管理一

来源:http://www.cnblogs.com/tgzhu/archive/2016/10/12/5946950.html
-Advertisement-
Play Games

目錄: 創建新變數 變數重編碼 日期值 數據排序 數據集合併 數據子集 隨機取樣 創建新變數 算術運算函數:x%%y 【求餘 x mod y, 5%%2的結果為1】, x%/%y 【整數除法,5% / %2 結果為2】, ^或 ** 求冪 如下示例數據,在對象中增加平均、合計變數(場景不大合適,主要 ...


 目錄:

  • 創建新變數
  • 變數重編碼
  • 日期值
  • 數據排序
  • 數據集合併
  • 數據子集
  • 隨機取樣

創建新變數


  • 算術運算函數:x%%y求餘 x mod y,  5%%2的結果為1】, x%/%y  【整數除法,5% / %2 結果為2】, ^或 ** 求冪
  • 如下示例數據,在對象中增加平均、合計變數(場景不大合適,主要為了說明問題)
  • 有多種方式來實現新增變數的處理,推薦使用 transform 示例代碼如下:
    > mydata <- transform(mydata,avg = (age + weight)/2 , total = age + weight)
    > mydata
      name age weight   avg total
    1 張三  32     42  37.0    74
    2 李四  45     56  50.5   101
    3 王五  25    120  72.5   145
    4 趙六  39    120  79.5   159
    5 老二 199    180 189.5   379

 

變數重編碼


  • 變數重編碼涉及根據現有變數的值創建新值的過程,如下圖,按客戶年齡分為青年、中年、老年進行統計
  • 上圖中,199明顯是異常數據,在進行轉換前必須將此賦為缺失值,語法為:
    > mydata$age[mydata$age == 199] <- NA
    > mydata
      name age weight
    1 張三  32     42
    2 李四  45     56
    3 王五  25    120
    4 趙六  39    120
    5 老二  NA    180
  • 變數重編碼,示例代碼如下:
    > mydata <- within(mydata,{
    +                  agecat <- NA
    +                  agecat[age >= 45] <- "Elder"
    +                  agecat[age > 25 & age < 45] <- "Middle Aged"
    +                  agecat[age <= 25] <- "Young"})
    > mydata
      name age weight      agecat
    1 張三  32     42 Middle Aged
    2 李四  45     56       Elder
    3 王五  25    120       Young
    4 趙六  39    120 Middle Aged
    5 老二  NA    180        <NA>
  • 註意:

    1. with() 與 within() 函數功能類似,不同點在於它允許你修改數據框

    2. 或 (|)與並(&)單字元表示與C#語法不一樣
    3. 上圖第5行數據包含缺失值,含用缺失值的算術表達式和函數的計算結果也是缺失值,通過na.omit()函數可刪除帶缺失值的行
    4. 大多數函數都擁有na.rm = TRUE選項,可在計算前移除缺失值並使用剩餘的值進行計算,如下
      > sum(mydata$age)
      [1] NA
      > sum(mydata$age,na.rm = TRUE)
      [1] 141

 日期值


  • 日期值預設輸入格式為:yyyy-mm-dd, R中通常以字元輸入,通過as.Date()函數進行轉換,輸入格式如下:
    1. %y             兩位數的年份                如: 07
    2. %Y             四位數的年份                如: 2007
    3. %a             縮寫的星期名                如: Mon
    4. %A             星期名                        如: Monday
    5. %b             縮寫的月份                  如:  Jan
    6. %B             月份                          如:  January
    7. %m            月份(00-12)
    8. %d             日期(00-31)
  • sys.Date(): 返回當天的日期
  • date():       返回當前的日期和時間
  • difftime():  計算時間間隔,語法:difftime(time1, time2, units = c("auto", "secs", "mins", "hours","days", "weeks"))
  • 註意:R內部最小日期  1970.01.01
  • 示例如下:
    > t <- Sys.time();t                      #獲取當前時間
    [1] "2016-10-11 17:43:27 CST"
    > as.POSIXlt(t-24*60*60)                 #獲取一天前的日期
    [1] "2016-10-10 17:43:27 CST"
    > l <- unclass(t);l                      #長整形的數據自1970-01-01年開始
    [1] 1476179008
    > as.POSIXct(l,origin = "1970-01-01")    #將長整形的數據轉換為日期型數據
    [1] "2016-10-11 17:43:27 CST"
    > format(t,format="%Y-%m-%d %H:%M:%S")   #自定義時間格式
    [1] "2016-10-11 17:43:27"
    > dob<-as.Date("2016-10-01")  
    > difftime(t,dob,units = "days")         #計算時間差
    Time difference of 10.40518 days

 數據排序


  • order()函數可對一個數據框排序,預設是升序,在變數前加減號可得到降序的排序效果
  • 上例按年齡升序、體重降序排列代碼示例:
    > with(mydata,{
    +   orderData <<- mydata[order(age,-weight),]  
    + })
    > orderData
      name age weight   avg total
    3 王五  25    120  72.5   145
    1 張三  32     42  37.0    74
    4 趙六  39    120  79.5   159
    2 李四  45     56  50.5   101
    5 老二 199    180 189.5   379

 數據集合併


  • merge(): 通過一個或多個共有變數橫向合半兩個數據框(即一種內聯結,inner join)
  • 語法: total <- merge(dataframeA, dataframeB,by=c("ID","country"))    #按ID和country進行合併
  • 按下麵各科成績數據與第一小節人員信息數據集合併示例
  • 示例代碼:
    > merge(m1,score,by=c("name"))
      name age weight  yw  sx  yy
    1 老二 199    180 100 100 100
    2 李四  45     56  80  87  76
    3 王五  25    120 100  98  87
    4 張三  32     42  90  80 100
    5 趙六  39    120  94  92  90
  •  cbind(): 直接橫向合併兩個數據框,不需要指定公共索引時使用,要求:每個對象擁有相同的數據行數和排序順序
  • 示例代碼:
    > cbind(m1,score)
      name age weight name  yw  sx  yy
    1 張三  32     42 張三  90  80 100
    2 李四  45     56 李四  80  87  76
    3 王五  25    120 王五 100  98  87
    4 趙六  39    120 趙六  94  92  90
    5 老二 199    180 老二 100 100 100
  • rbind(): 縱向合併兩個數據框(兩個數據框必須擁有相同的變數名,順序不必一定相同), 示例如下:
    > m2 <- data.frame(name=m1$name,yw=m1$age,sx=m1$weight,yy=m1$weight%%m1$age)
    > rbind(m2,score)
       name  yw  sx  yy
    1  張三  32  42  10
    2  李四  45  56  11
    3  王五  25 120  20
    4  趙六  39 120   3
    5  老二 199 180 180
    6  張三  90  80 100
    7  李四  80  87  76
    8  王五 100  98  87
    9  趙六  94  92  90
    10 老二 100 100 100
  •  

數據集取子集


  • 以上一節 cbind(m1,score) 合併後的數據集為例,取1、2、6、7 列數據,實現方式如下:
  • 方式一:保留變數
    > x <- cbind(m1,score);x
      name age weight test name  yw  sx  yy
    1 張三  32     42   10 張三  90  80 100
    2 李四  45     56   11 李四  80  87  76
    3 王五  25    120   20 王五 100  98  87
    4 趙六  39    120    3 趙六  94  92  90
    5 老二 199    180  180 老二 100 100 100
    > y <- x[,c(1,2,5,6)];y
      name age name.1  yw
    1 張三  32   張三  90
    2 李四  45   李四  80
    3 王五  25   王五 100
    4 趙六  39   趙六  94
    5 老二 199   老二 100
  • 方式二:剔除變數 (在某一列的前面加負號就會剔除某列)
    > z <- x[,c(-3,-4,-5,-8)];z
      name age  yw  sx
    1 張三  32  90  80
    2 李四  45  80  87
    3 王五  25 100  98
    4 趙六  39  94  92
    5 老二 199 100 100
  • 方式三:賦NULL值,註意:NULL 與 NA是不同的
> x$weight <- x$test <- x[,5] <- x$yy <- NULL
> x
  name age  yw  sx
1 張三  32  90  80
2 李四  45  80  87
3 王五  25 100  98
4 趙六  39  94  92
5 老二 199 100 100
  • 方式四:subset()取子集
    > x1 <- cbind(m1,score);x1
      name age weight name  yw  sx  yy
    1 張三  32     42 張三  90  80 100
    2 李四  45     56 李四  80  87  76
    3 王五  25    120 王五 100  98  87
    4 趙六  39    120 趙六  94  92  90
    5 老二 199    180 老二 100 100 100
    >  subset(x1,age>=25 & age < 50,select = c("name","age","yw","sx"))
      name age  yw sx
    1 張三  32  90 80
    2 李四  45  80 87
    3 王五  25 100 98
    4 趙六  39  94 92
  • 方法五: sqldf()函數使用sql語句對數據框進行操作,需安裝 sqldf 包,語法: install.packages("sqldf")
    > x1 <- merge(m1,score,by=c("name"));x1
      name age weight  yw  sx  yy
    1 老二 199    180 100 100 100
    2 李四  45     56  80  87  76
    3 王五  25    120 100  98  87
    4 張三  32     42  90  80 100
    5 趙六  39    120  94  92  90
    >  library(sqldf)
    >  sqldf("select name,age,yw,sx,yy from x1 where age >=25 and age < 35 order by age")
      name age  yw sx  yy
    1 王五  25 100 98  87
    2 張三  32  90 80 100
  •  

隨機取樣


    • sample():  從大資料庫中隨機抽取大小為n的樣本,在數據挖掘和機器學習領域,抽樣是常見的做法
    • replace 參數控制抽取數據有放回或無放回
    • 示例:從上例x1 對象中隨機無放回取2份樣本
      > y1 <- x1[sample(1:nrow(x1),size = 2,replace = FALSE),]
      > y1
        name age weight yw sx yy
      2 李四  45     56 80 87 76
      5 趙六  39    120 94 92 90
      > y1 <- x1[sample(1:nrow(x1),size = 2,replace = FALSE),]
      > y1
        name age weight  yw  sx  yy
      1 老二 199    180 100 100 100
      3 王五  25    120 100  98  87

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在進行ETL開發時,數據類型(Data Type)是最基礎的,但也容易被忽略,樓主使用的SQL Server 版本是2012,用此博文記錄,常用的SSIS數據類型和TSQL數據類型的映射關係。SSIS的數據類型,主要是指數據流(Data Flow)數據類型和變數(Variable)數據類型。 當數據 ...
  • 無意睹到一篇舊文檔 SR0008:考慮使用 SCOPE_IDENTITY 代替 @@IDENTITY :https://msdn.microsoft.com/zh-cn/library/dd172121(v=vs.100).aspx 日常開發,我們如果在插入記錄的同時需要返回插入的IdentityI ...
  • 如果你初識MySql的話,那麼這些語法糖你有必要知道。 1.Sql創建資料庫 2.Sql創建數據表 3.創建存儲過程 4.關於批量更新和插入數據到mysql ...
  • 最近筆試面試特別多的都問到了資料庫索引,由於之前並沒有單獨做系統的複習,導致許多關於索引的知識點記憶的很模糊,今天整理下相關筆記(並沒有深挖,對於初學者還是可以看看的),僅供參考。 什麼是索引 資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。 例如這樣一個查詢:select * from ...
  • 簡介 對於資料庫運維人員來說創建session或者查詢時產生問題是常規情況,下麵介紹一種很有效且不藉助第三方工具的方式來解決類似問題。 最近開始接觸運維工作,所以自己總結一些方案便於不懂資料庫的同事解決一些不太緊要的資料庫問題。類似方法很多理論也很多,我就不做深究,就是簡單寫一個方案,便於菜鳥使用的 ...
  • 1. 資料庫文件被其他線程覆蓋或刪除在文件描述符關掉以後,繼續使用這個文件描述符訪問打開文件,獲取文件描述符fd(其實是一個整形)關閉文件打開sqlite文件,獲取文件描述符(碰巧也是)fd另一個線程繼續使用fd,寫文件sqlite文件被損壞在事務進行過程中,進行資料庫備份或恢覆在資料庫事務過程中,... ...
  • 這是 《MySQL 必知必會》 的讀書總結。也是自己整理的常用操作的參考手冊。 使用 MySQL 連接到 MySQL shell>mysql -u root -p Enter password:******顯示資料庫 mysql>SHOW DATABASES;選擇資料庫 mysql>USE myte... ...
  • Apache Hadoop 生態圈軟體下載地址:http://archive.apache.org/dist/hadoop/hadoop下載地址 http://archive.apache.org/dist/hadoop/common 安裝環境 虛擬機中的 CentOS 64位 需要安裝軟體: jd ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...