2013-08-19 61 views
0

我確定有我的問題的答案,但我似乎無法找到一個工作,我絕對是新的R,所以冗餘的道歉!轉換和合並R中的數據集

所以我有一個巨大的數據集--17K obs與35個變量。這是一個我導入並用as.matrix強制的txt文件。第一列有字符值,其餘34列有數字值。

結構 -

>str(data_m) 
chr [1:17933, 1:35] "RAB12" "TRIM52" "C1orf86" "PLAC9" "MORN3" "LOC643783" "LOC389541" "OAZ2" ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:35] "Name" "X118" "X12" "X21" ... 

現在有2列另一個小長表數據集 - ID和性別。

> str(data_maleids) 
'data.frame': 24 obs. of 2 variables: 
$ id : Factor w/ 34 levels "X118","X12","X21",..: 8 23 9 19 10 7 5 4 2 30 ... 
$ gender: Factor w/ 2 levels "female","male": 2 2 2 2 2 2 2 2 2 2 ...` 

例如, -

row.names id gender 
1 1   X37 male 
2 2   X64 male 

我想要做的只是爲第二數據集中存在的那些id(X37,X64等)的第一個數據集設置子集。

我試着轉置較大的數據集,但是這給了我在列名方面的問題,我似乎無法解決這個問題。

+2

當您讀入第一個數據幀時,請不要將其強制轉換爲矩陣。當你閱讀你的第二個數據框(只有id和性別)時,設置'stringsAsFactors = FALSE'。然後,只需執行'df1 [df1 $ Name%in%df2 $ id,]''。 – Thomas

+0

它應該是colnames(df1)而不是$ Name的權利?因爲df2中的id實際上是df1中的列名。但邏輯起作用。謝謝 !然而,這導致了另一個步驟,即將原始數據集中的第一列$ Name合併回來,但這並不是我想要的最好的方法。應該有一種方法來保留名爲子集的名稱列 – user2695213

回答

2

第一條評論是關於你的陳述「第一列有字符值,其餘34列有數字值」。 data_m是一個矩陣,所以所有的列都是相同的類型。在這種情況下字符。你可以從str()的輸出中看到它。將R中的矩陣想象成一個排列成幾列的向量。

其次,我建議您使用data.table包(如果您還沒有安裝,請安裝它)來執行此任務。語法的草圖會是這樣的:

  1. 讀入的數據有一個很好的功能fread()data.table包來讀取文本文件中的數據作爲data.table 對象:data_m <- fread("file.name.txt")
  2. 關鍵data_m變量idsetkey(data_m, id)
  3. data_maleidsids <- sort(unique(data_maleids$id))做一個向量ID。
  4. 選擇您需要的箱子:data_m[id %in% ids]
+1

嗨..我試過安裝data.table包,但R似乎不能找到fread函數(v 3.0.1)「錯誤:找不到函數」fread「 – user2695213

+2

您必須加載包以使其在require(data.table)'會話期間可用。 – djhurio