簡體   English   中英

R-列標題向量對行的交互式子集

[英]R - interactive subsetting of rows by vector of column headers

我有以下格式的2個不同的數據框:

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中,某些行沒有“ +”。 這些是我最終想要保留的行,以便可以繪制散點圖。 我已經相應地編輯了數據框。 我只是在尋找答案以嘗試理解它們。 我對R還是很陌生。

假設您的數據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從條件條件為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  +   

我有一個解決方案,您不選擇列,而是將所有帶有“ +”和NA的行從數據框中刪除。 我不知道這有沒有幫助。 它基於以下問題: 使用OR使用dplyr篩選數據幀的更好方法?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM