2016-03-02 724 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