2012-06-06 49 views
2

我必須根據特定條件從數據框中選擇一堆數據。數據幀看上去大致是這樣的:如何有條件地選擇與多種因素相匹配的data.frame的所有元素

F1 F2 D1 D2 
1 A1 B1 1 0 
2 A1 B1 1 1 
3 A1 B1 0 0 
4 A1 B2 1 0 
5 A1 B2 0 0 
6 A2 B2 1 0 
7 A2 B2 1 1 

Fx的因素,並且是Dx數據值。我需要做的是以下幾點:

  1. 查找具有與特定模式匹配的數據值的行。
  2. 對於每個與該模式相匹配的行,查找具有相同的因素
  3. 對於每一個獨特的要素組合中的所有行,塗抹一些操作上有一個組合

舉例而言,所有的行,

factors <- unique(data[D1==1 & D2 == 1, c("F1","F2")]) 

會給我第1步,大部分的2

而且隨着

data[data$F1 %in% factors$F1 & data$F2 %in% factors%F2,] 

我越來越接近解決方案,但使用上面的示例數據,這將選擇所有行。但不應選擇第4行和第5行,因爲它們不是完全匹配的。我如何添加某種條件,要求在同一行中發生%的匹配?

我覺得這應該是一種常見的操作,因此R可能有一個聰明的方法來做到這一點。

任何想法????謝謝。

+0

瞭解'plyr'軟件包 - 這將使您的大部分分析變得非常簡單。 – Andrie

+0

謝謝,我會研究它。 – Jochen

回答

1

你可以使用data.table包的索引來選擇所有必須操作的行。

data <- data.table(data,key="F1,F2") 
data[unique(data[D1 == 1 & D2 == 1,list(F1,F2)])] 
+0

謝謝。這似乎正在複製我已有的東西。但我只是我不確定如何從那裏移動。我想data.table文檔將幫助我。 – Jochen

+0

謝謝,想通了。這似乎是最簡單的解決方案。 – Jochen

0

感覺像tapplypaste ...的工作...例如,讓我們將data2定義爲與您的數據對象相同,但帶有「Val」列(您不說哪種行操作可能需要這樣做,所以這只是幫助說明)...

F1 F2 D1 D2 D3 D4 Val 
1 A1 B1 1 1 0 1 7 
2 A1 B1 1 0 1 1 19 
3 A2 B1 1 1 1 1 43 

現在檢查出以下命令:

tapply(data2$Val,paste(data2$F1,data2$F2,sep="~"),sum) 

你應該得到這樣的輸出:

A1~B1 A2~B1 
    26 43 

應該清楚R是計算每個可能的F1和F2的組合的Val的總和(實際上,正如命令所示,它看着F1和F2的糊狀物相同的東西)。對於A1〜B1,總和爲26(7 + 19),對於A2〜B1,總和爲43(只有一個這樣的行)。在tapply中將sum更改爲length,您將得到這樣的行數,依此類推。

希望這有助於... :)

編輯:剛纔看到你的修改。如果您剛好在F1和F2的組合是您的因素對象中列出的F1和F2的組合之一的數據行之後...你可以只使用paste

data[paste(data$F1,data$F2,sep="~") %in% paste(factors$F1,factors$F2,sep="~"),] 

sep="~"並不是必需的,只是習慣的力量。上面的行應該給你你想要的行,我想。如果要執行上具有特定F1/F2組合行的各子集的功能,使用tapply如上:)


dput爲DATA2解釋是下面的方便:

structure(list(
F1 = structure(c(1L, 1L, 2L), .Label = c("A1", "A2"), class = "factor"), 
F2 = structure(c(1L, 1L, 1L), .Label = "B1", class = "factor"), 
D1 = c(1L, 1L, 1L), D2 = c(1L, 0L, 1L), D3 = c(0L, 1L, 1L), 
D4 = c(1L, 1L, 1L), Val = c(7, 19, 43)), 
.Names = c("F1", "F2", "D1", "D2", "D3", "D4", "Val"), 
row.names = c(NA, -3L), class = "data.frame") 
+0

請先查看我提議的解決方案的「編輯」部分......它應該有望解決您的問題:) –

相關問題