2016-08-09 55 views
0

我具有以下格式的2個不同的數據幀的向量的行的交互式子集:的R - 由列標題

DF1 -

v1 v2 v3 v4 v5 
a 1 2 + 
b 5 2 + + 
c 5 2 +  + 
d 4 3  + + 
e 1 5 +  + 
f 3 5 
g 4 2 
h 3 1 
i 5 5 +  + 

DF2 -

v1 v2 v3 v4 
a 1 2 + 
b 5 2 + + 
c 5 2 +  
d 4 3  + 
e 1 5 +  
f 3 5 
g 4 2 
h 3 1 
i 5 5 +  

我的腳本給出了v1 & v2的散點圖,但是首先我刪除了在在v3-v4或v3-v5中至少有一個「+」。

我的數據幀可以更大,並且具有更多的v1-v2對,但始終具有帶有「+」的v3-v4或v3-v5列。我手動調整代碼以指定要繪製的列和要刪除的行,具體取決於我正在處理的DF格式。

它工作得很好,但我想使腳本更具交互性如下:

# Select v3-v4 or v3-v5 via interactive gui to give vector of column headers. 
remove.vars.vector <- select.list(names(DF), # Select columns as vector of column header names via interactive gui. 
          multiple = TRUE, # Can choose multiple columns. 
          title = "Choose variables to remove from data set", # Title on gui. 
          graphics = TRUE) # Allow launch of gui. 

# Return columns from DF with this vector of column headers. 
remove.vars.subset <- DF[remove.vars.vector] 
# Return rows that have at least one "+" in v3-v4 or v3-v5. 
remove.vars.subset.+ <- subset(DF, remove.vars.subset == "+") 
# Removes all rows that contain >=1 NA. 
complete.data.+ <- remove.vars.subset.+[complete.cases(remove.vars.subset.+), ] 
# Combine by rows "complete.data.+" with DF. 
combo.list <- rbind(DF,complete.data.+) 
# Remove duplicate rows from combined data frame. 
complete.data <- combo.list[!duplicated(combo.list, fromLast = FALSE) & !duplicated(combo.list, fromLast = TRUE),] 

問題:上述代碼不完全剝離包含行的數據幀中的至少一個「+ 「在v3-4或v3-5中。這個問題似乎是這些行:

# Return rows that have at least one "+" in v3-v4 or v3-v5. 
    remove.vars.subset.+ <- subset(DF, remove.vars.subset == "+") 

我也在最後得到的行數僅NA在每個細胞中,因此在下一行代碼complete.cases。

因此,最終的數據框仍然包含一些在v3-4或v3-5中帶有「+」的行。

問題

有沒有更好的方式來子集數據幀行使用的列標題的載體可以在他們的行包含「+」?

預先感謝您。

編輯 - 09/08/2016 - 18:54 我剛剛注意到我沒有說明我的數據框的內容。某些行在v3-v4或v3-v5中沒有「+」。這些是我最終想要保留的行,所以我可以繪製分散圖。我相應地編輯了數據框。我只是在尋找答案來嘗試和理解它們。我仍然很陌生。

回答

0

假設你的數據DF

> DF 
    v1 v2 v3 v4 v5 
1 1 2 +  
2 5 2 + + 
3 5 2 +  + 
4 4 3  + + 
5 1 5 +  + 

,我挑v3v4。然後remove.vars.subset,下面的代碼,是

> remove.vars.subset 
    v3 v4 
1 + 
2 + + 
3 + 
4  + 
5 + 

,並注意remove.vars.subset == "+"評估爲

> remove.vars.subset == "+" 
     v3 v4 
[1,] TRUE FALSE 
[2,] TRUE TRUE 
[3,] TRUE FALSE 
[4,] FALSE TRUE 
[5,] TRUE FALSE 

那麼,什麼subset正在做的是問R從哪裏condition的TRUE數據幀返回行,即:

DF[c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE),]

級聯所述第一和第二列。但數據框中只有5行,而邏輯向量中有10個元素。由於DF只有5行,所以附加了NA(因此它好像DF有10行)並且相應地評估表達式。所以你看:

> subset(DF, remove.vars.subset == "+") 
    v1 v2 v3 v4 v5 
1  1 2 +   
2  5 2 + +  
3  5 2 +   + 
5  1 5 +   + 
NA NA NA <NA> <NA> <NA> 
NA.1 NA NA <NA> <NA> <NA> 

你可能想嘗試什麼是

DF[!apply(remove.vars.subset, MAR=1, function(x) any(x=="+")), ] 
> DF[!apply(remove.vars.subset, MAR=1, function(x) any(x=="+")), ] 
[1] v1 v2 v3 v4 v5 
<0 rows> (or 0-length row.names) 

不返回任何行,因爲所有的行(給定的v3v4選擇)至少有一個「+」,在他們。但是,假設我們選擇v4v5

> DF[!apply(remove.vars.subset, MAR=1, function(x) any(x=="+")), ] 
    v1 v2 v3 v4 v5 
1 1 2 + 
+0

剛剛嘗試過你的建議,它的工作完美。你正確地猜測有些行不會有「+」(我在嘗試你的建議之前編輯過我的文章)。應用系列功能已移到我的列表的頂部,以便在R中進行探索。非常感謝您的快速響應。 –

+0

PS:我通過將我的原始方法數據框綁定到用您的修改生成的數據框來驗證,然後刪除重複的行。答案是數據框沒有行....真棒。我的大腦正在緩慢採用R編程邏輯! –

0

我有一個解決方案,你不帶「+」和NA從數據框刪除選擇列,但所有行。我不知道這是否有幫助。 它是基於以下問題: Better way to filter a data frame with dplyr using OR?

v1 <- c(1,2,3,4,5,NA) 
v2 <- c(1,2,3,4,5,NA) 
v3 <- c("","+","+","","",NA) 
v4 <- c("","+","","+","",NA) 
v5 <- c("","+","","","",NA) 

D1 <- cbind.data.frame(v1,v2,v3,v4,v5,stringsAsFactors=F) 

library(dplyr) 

remove.vars.vector <- c("v3","v4","v5") 
condition <- c("+",NA) 

D1 %>% 
    filter(rowSums(sapply(D1, FUN = "%in%", condition)) == 0) -> D1_new 

編輯: 我發現了一個可能選擇列,遺憾的是我沒有找到一個解決方案,選擇由特徵向量列:

D1 %>% select_(remove.vars.vector) -> D1_sub # NOT working 

D1 %>% select(v3:v5) -> D1_sub # working 
D1 %>% select(v3,v4,v5) -> D1_sub # working 
D1 %>% select_("v3","v4","v5") -> D1_sub # working 

D1 %>% 
    filter(rowSums(sapply(D1_sub, FUN = "%in%", condition)) == 0) -> D1_new 
+0

謝謝你的建議。我繞圈轉了一會兒,試圖通過列標題的矢量進行子集分析。 http://stackoverflow.com/users/6455166/weihuang-wong做到了 –