2012-02-21 59 views
2

這是一個非常簡單的問題。如何在列中使用多個字符來子集數據

我有一個冗長的數據集,並希望根據特定列中的某些條目創建子集。在這種情況下,我將其設置是這樣的:

實施例的數據:

> NL 

SNP alleles 

rs1234 A_T 

rs1235 A_G 

rs2343 A_T 

rs2342 G_C 

rs1134 C_G 

rs1675 T_A 

rs8543 A_T 

rs2842 G_A 

P <- subset(NL, alleles = "A_T", alleles = "T_A", alleles = "G_C", alleles = "C_G") 

這將運行沒有錯誤,但所得到的P不以任何方式子集(P的尾仍然顯示相同數量的作爲原始NL的條目)。

我在做什麼錯?

+0

你想讓你的'subset'成爲'vector''中的等位基因''('A_T','T_A','G_C','C_G')'?附:這是一個暗示的謎語。 – Justin 2012-02-21 20:49:15

回答

4

當你的意思是「==」時,最明顯的錯誤是使用「=」。但我從上下文猜你真的想「分裂」這樣的數據:

split(NL, NL$alleles) 

,這將創造dataframes每一個具有alleles值的一個列表。

也許你想使用模式匹配:

NL[ grepl("C_G|G_C|A_T|T_A", NL$alleles), ] 
    SNP alleles 
1 rs1234  A_T 
3 rs2343  A_T 
4 rs2342  G_C 
5 rs1134  C_G 
6 rs1675  T_A 
7 rs8543  A_T 

而且與我所想的是你的意見,例如說明:

P <- read.table(text="V1 V2 V3 V4 V5 V6 alleles 
15116 25 rsX 0 123412 G A G_A 
15117 25 rsX1 0 23432 A C A_C 
15118 25 rsX2 0 234324 A G A_G 
15119 25 rsX3 0 3423 A G A_G 
15120 25 rsX4 0 2343223 C A C_A 
15121 25 rsX5 0 23523423 A G A_G", header=TRUE) 

P[ grepl("G_A", NL$alleles), ] 

#  V1  V2 V3  V4 V5 V6 alleles 
# 15116 25 rs306910 0 154613671 G A  G_A 

子集版本:

subset(P, alleles %in% c("G_A", "A_G")) 

     V1 V2 V3  V4 V5 V6 alleles 
15116 25 rsX 0 123412 G A  G_A 
15118 25 rsX2 0 234324 A G  A_G 
15119 25 rsX3 0  3423 A G  A_G 
15121 25 rsX5 0 23523423 A G  A_G 
+0

使用==會給我以下錯誤:** [.data.frame'(x,r,vars,drop = drop)中的錯誤: 找不到對象'alleles'**但是,我可以使用split。謝謝! – mfk534 2012-02-21 20:58:30

+1

@ user1224314如果是這種情況,那麼您在問題中提供的數據以及您在計算機上使用的數據會有所不同。我們只能根據您提供的示例數據提供幫助。 – joran 2012-02-21 21:03:48

+0

@ user1224314確保您的NL對象是數據框,並且等位基因列的名稱是「等位基因」。你可以使用'str(NL)'來查看它有什麼結構,'name(NL)'來查看列名。 – Gregor 2012-02-21 21:04:07

0

=用於傳遞參數或賦值。你需要的是測試是否屬實,使用==。你也傳遞了多個標準,而不是指定應該如何組合。我很確定你想要那些條件爲的任何的子集(不是全部),但是R不。對於這種情況,你可以使用%in%操作:

P <- subset(NL, alleles %in% c("A_T", "T_A", "C_G")) 

還要注意,你想給subset幾個條件,但是你不告訴它如何將它們結合起來。我可以看到你想要的是任何條件爲真的行,但是你必須告訴R使用OR運算符|,例如,

P <- subset(NL, alleles == "A_T" | alleles == "T_A" | alleles == "C_G") 

上面的%in%運算符就像這樣的簡寫。

相關問題