[英]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 + +
我選擇v3
和v4
。 然后按照代碼執行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)
它不返回任何行,因為所有行(根據v3
和v4
的選擇)中至少包含一個“ +”。 但是假設我們選擇了v4
和v5
:
> 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.