删除在另一个数据帧的相应行中具有特定值的数据帧中的行

问题描述:

我有两个数据帧。删除在另一个数据帧的相应行中具有特定值的数据帧中的行

第一个包含我的实际数据,我们称之为数据。第二个用作指示符矩阵,它使用if-else语句构造,该语句检查包含至少1或2的一行值的发生,我们称之为指示

下面是一个例子:

col1<-c(1,3,1,3,2) 
col2<-c(3,4,2,3,"") 
col3<-c(1,3,"","","") 
col4<-c(2,"","","","") 

data<-data.frame(cbind(col1,col2,col3,col4)) 

> data 
    col1 col2 col3 col4 
    1 3 1 2 
    3 4 3  
    1 2   
    3 3   
    2 

数据的行必须包含至少一个1或2,所以这里是我的功能:

remove<-function(x){ 

    if (((x[1] == "1") | (x[1] == "2")) | ((x[2] == "1") | (x[2] == "2")) 
     | ((x[3] == "1") | (x[3] == "2")) | ((x[4] == "1") | (x[4] == "2"))){ 
    return(0) 
    } 

else{ 
    return(1) 
} 
} 

indic<-data.frame(apply(data,1,remove)) 

> indic 
     y 
1  0 
2  1 
3  0 
4  1 
5  0 

通过观察数据,第2行和第4行不包含至少1或2,这由标记确认。

我想删除在数据,其对应于行2和4中印度语行2和4。我已经试过如下:

finalMatrix<-class(array) 

for(i in 1:nrow(indic)){ 
    if (indic[i,1] == "1"){ 
    finalMatrix = data[-i,] 
    } 
    else{ 
    data[i,] = data[i,] 
    } 
} 

然而,我的输出是这样的:

> finalMatrix 
    col1 col2 col3 col4 
    1 3 1 2 
    3 4 3  
    1 2     
    2  

,有效地消除了第四行只。我认为这可能与我必须在每次迭代后创建一个新的数据帧有关,但问题是迭代长度会改变。

想知道如果我在正确的轨道上与我的代码...任何建议将是可爱的。我一直在推翻这一点。

-Soph

+3

我不确定我是否理解这个问题。你想要像'finalMatrix Vandenman

+1

'finalMatrix

+1

为什么不只是'数据[rowSums(数据== “1” |数据== “2”)> 0, ]'?你没有正确地使用矢量化,而'for'循环效率很差。此外,似乎没有理由强迫你的价值观“人物”;缺少值使用'NA'。 – nicola

你可以尝试生成TRUE/FALSE缩放的矢量,而不是你的印度语载体,其中包含0/1。这使得最终过滤更加明显。

> data 
    col1 col2 col3 col4 
1 1 3 1 2 
2 3 4 3  
3 1 2   
4 3 3   
5 2   

采用any会给您轻松访问的12行的内容。第二个any会告诉你,如果满足两个条件之一。通过所有行的apply()的运行,如果第二个参数被设置为1

indic <- apply(data, 1, function(row) { 
    any(c(any(row == 1), any(row == 2))) 
}) 


> indic 
[1] TRUE FALSE TRUE FALSE TRUE 

> data[indic,] 
    col1 col2 col3 col4 
1 1 3 1 2 
3 1 2   
5 2 

至于你的问题的标题所暗示的印度语载体也可以应用到另一个数据帧,但在这里,重要的是要注意具有相同尺寸的数据帧和指示向量或者针对向量回收。

拿起@ nicola建议使用矢量化。

data[rowSums(data=="1" | data=="2")>0,] 

这样做可以最有效地保留循环并创建indic。尽管从rowSums(data=="1" | data=="2")>0发出的TRUE/FALSE矢量仍然可以保存在变量中。