2017-09-28 74 views
1

我有一個數據幀,它有一個變量序列c1...c20。每個變量都包含一個代碼。我有一個代碼向量,code.vec,並且我想要將數據集的子集包含c1|c2|c3|...|c20位於code.vec的記錄。基於變量序列過濾數據幀

實例數據(僅使用了例如3個cn變量):

code.vec<-c("T1", "T2", "T3", "T4") 

c1<-c("T1", "X1", "T6", "R5") 
c2<-c("R4", "C6", "C7", "X3") 
c3<-c("C5", "C2", "X4", "T2") 

df<-data.frame(c1, c2, c3) 

這是我目前在做什麼:

library(dplyr) 
df %>% filter(c1 %in% code.vec | c2 %in% code.vec | c3 %in% code.vec) 

    c1 c2 c3 
1 T1 R4 C5 
2 R5 X3 T2 

這工作,但由於真正的數據幀有20 cn變量,它變得很多打字。似乎應該有一個簡單的應用程序或循環解決方案(這很容易在SAS中使用數組和循環),但我無法在R中找到解決方案,而且我也找不到任何類似的問題這裏。

回答

1

下面是一個簡單的解決方案使用從filter_alldplyr

library(dplyr) 

df %>% 
    filter_all(any_vars(. %in% code.vec)) 

結果:

c1 c2 c3 
1 T1 R4 C5 
2 R5 X3 T2 

提及ED的評論,相反,如果你想在哪裏所有變量包含code.vec行過濾,則可以使用替代any_varsall_vars

df %>% 
    filter_all(all_vars(. %in% code.vec)) 
+0

這完美地工作。它表明在某種地方有一種解決方案比我想要做的要簡單得多。 – patward5656

+0

@ patward5656'tidyverse'確實非常強大。另外,如果你想對_all_變量包含'code.vec'的行進行過濾,你可以改爲使用'df%>%filter_all(all_vars(。%in%code.vec))''。 – useR

+1

這是有史以來最受讚賞的答覆之一。它有一個唯一的upvote,從我這裏,很棒。 – Dirk

0

下面是一個應該比較快的方法。

# get the position of the rows that match using modulus (final row returns 0) 
temp <- which(unlist(dat) %in% code.vec) %% nrow(dat) 
# replace 0s with final row 
temp[temp == 0] <- nrow(dat) 

然後子集

dat[unique(sort(temp)),] 
    c1 c2 c3 
1 T1 R4 C5 
4 R5 X3 T2 

注意,我與特徵向量在data.frame變量工作。如果您將它們存儲爲因子,則需要將unlist(dat)換算爲as.character()

數據

dat <- 
structure(list(c1 = c("T1", "X1", "T6", "R5"), c2 = c("R4", "C6", 
"C7", "X3"), c3 = c("C5", "C2", "X4", "T2")), .Names = c("c1", 
"c2", "c3"), row.names = c(NA, -4L), class = "data.frame")