2016-03-02 51 views
1

我有一個數據框列表,我想遍歷它們並保留與特定列名稱的特定值匹配的行,我想傳遞這些列名稱的向量以及它們的相應值。在R中保留某些列

例子:

DF1 = 
x y 
10 s 
5 h 

DF2 = 

x z y 
11 h h 
5 s s 
5 h s 

所以我想通過這些dataframes循環,並保持與具有(5,S)值(X,Y)列名的任何行。那只是一個例子,我想讓我的代碼廣爲流傳。

我想這一點,但它肯定是不工作是這樣的:

Data-Mining = sapply(DFlist,) 

我欣賞的幫助。

回答

1

下面我重新創建您在示例中提供的兩個data.frame對象,然後使用lapplydplyr包中的兩個函數根據您的輸出選擇和過濾。 Select子集感興趣的列,並且filter選擇符合某些邏輯標準/條件的行。

library(dplyr) 

DF1 = data.frame(x=c(10,5), y=c('s','h')) 

DF2 = data.frame(x=c(11,5,5), z=c('h', 's', 'h'), y = c('h','s','s')) 


DFlist <- list(DF1, DF2) 



colsKeep <- c('x', 'y') 
xRange <- 1:5 
yVal <- 's' 

lapply(DFlist, function(x){x %>% 
          select(one_of(colsKeep)) %>% 
          filter(x %in% xRange & y == yVal)}) 

編輯:我現在指定要保留的列以及我將在子集中接受的值。

+0

這是一個例子,你能概括一下「lapply」這一行嗎? – lel

+0

你能不能使用任何包? – lel

+0

爲什麼你不想使用任何包?如果不是好的軟件包數量,我會盡可能快地放棄'R',好像它很熱並學習'Julia'。 –

1

這樣的事情呢,依靠merge來保持行。如果你有很多變量要匹配,可能比編寫選擇語句容易。我添加了一個既沒有x也沒有y變量的額外數據集,以顯示這個問題是如何解決的。

DF1 <- data.frame(x=c(10,5), y=c('s','h')) 
DF2 <- data.frame(x=c(11,5,5), z=c('h', 's', 'h'), y = c('h','s','s')) 
DF3 <- data.frame(a=1:3,b=2:4) 

vals <- list(5, "s") 
nams <- c("x","y") 
lapply(list(DF1,DF2,DF3), function(DAT) { 
    DAT[setdiff(nams, names(DAT))] <- NA 
    merge(DAT, setNames(vals,nams), by=nams) 
}) 

#[[1]] 
#[1] x y 
#<0 rows> (or 0-length row.names) 
# 
#[[2]] 
# x y z 
#1 5 s s 
#2 5 s h 
# 
#[[3]] 
#[1] x y a b 
#<0 rows> (or 0-length row.names) 
+0

這可能是好的,但它不是一般化的,你可以概括它嗎? – lel

+0

我不明白,什麼不是泛泛而談。它可以採用任何輸入文件和值的組合來匹配 - 你想要像lapply(list(DF1,DF2),function(DAT)DAT [with(DAT,x == 5&y ==「s」)) ,])'而不是? – thelatemail

+0

列名是一個將通過函數傳遞的向量,並且每次更改它的長度也會改變,並且相應的值是相同的大小寫。如果我們通過「值」調用Col名稱「colunames」的向量和相應值的向量,可以告訴我如何重新使用您的代碼行嗎? – lel