2016-11-22 75 views
1

假設我有以下data如何刪除R中不需要的功能?

   'aaa'  'a'  'aaron'  'abcde'  'azz' 
     x1 ...  ...  ...   ...  ... 
     x2 ...  ...  ...   ...  ... 
     x3 ...  ...  ...   ...  ... 

鑑於英語單詞一個預先定義的列表中,我該如何使用which(.. %in% ..)運營商獲得,以僅保留存在於前期的特徵向量位置 - 定義的英文單詞列表?

預期輸出:

 'a'  'aaron'  
x1 ...  ...  
x2 ...  ...  
x3 ...  ...  
+2

不是很清楚。請更清楚地解釋一下。如果你有一個名稱向量,即'v1',那麼'df1 [,%name%(df1)%%]' – akrun

回答

1

如果你有列名的列表,你要保持你可以運行這個命令:

dat = dat[, colnames(dat) %in% list] 

如果你有列名的列表,你不想讓你可以運行這個命令:

dat = dat[, !(colnames(dat) %in% list)] 

如果您使用的是data.table你將有包括=這是工作的假。

dat = dat[, colnames(dat) %in% list, with = FALSE] 
+0

在邏輯向量周圍使用哪個(。)並不是一個好主意。繼續使用'%in%'生成的邏輯向量進行索引。然後,更重要的是,' - 這(*)'*是危險的*,當沒有匹配時,它非常失敗,在這種情況下'!(... <您的邏輯> ..)'完美地工作。 @ akrun的回答更好 –

+0

@MartinMächler感謝您的反饋。我已經更新了代碼。你能解釋爲什麼用邏輯向量索引是不好的?我知道這不是必要的,但它會真正導致錯誤或性能問題? – Kristofersen

1

您可以在許多方面做到這一點。使用which,就可以得到所需的列位置的向量,然後選擇那幾行:

cols <- which(colnames(data) %in% list) 
data[cols] 

一種不同的方法是使用dplyr的選擇:

data %>% select_(.dots = list) 
3

如果我們有一個矢量名字,然後用%in%

df1[,colnames(df1) %in% v1] 
1

(長地回答了@Kristofersen昨天的問題),這是相反的:索引與邏輯載體是更安全:我給了一個重要的原因上面已經:「 - 這(...) 」。請嘗試製作這樣一個「不匹配」的例子,並親自查看。 第二個原因:處理NA(意外):如果你的邏輯向量包含NA,哪個(。)全部消除了它們,並且你沒有注意到你的數據有什麼「奇怪」(因爲這通常是NA的原因邏輯向量
第三個原因:當出現新的選擇條件時,您可以很容易地和/或(即,&,|)邏輯向量。整數索引向量的等價物更容易出錯((儘管您經常可以使用union ()/ intersect()/ setdiff()there ..))保持邏輯更清潔更安全,在邏輯向量周圍使用which(.)進行索引是不好的練習,在R代碼中太多的地方出現。沒有時間在這個權利上進行「講座」,對不起。

相關問題