Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 删除数据帧中在另一数据帧的对应行中具有特定值的行_R_Dataframe_Rows_Indicator_Grepl - Fatal编程技术网

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

R 删除数据帧中在另一数据帧的对应行中具有特定值的行,r,dataframe,rows,indicator,grepl,R,Dataframe,Rows,Indicator,Grepl,我有两个数据帧 第一个保存我的实际数据,我们称之为数据。第二个用作指示符矩阵,它使用if-else语句构造,该语句检查至少包含1或2的值行的出现情况,我们称之为indic 以下是一个例子: 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

我有两个数据帧

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

以下是一个例子:

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   
这实际上只消除了第四行。我认为这可能与我必须在每次迭代后创建一个新的数据帧这一事实有关,但问题是迭代长度发生了变化

不知道我的代码是否正确。。。任何建议都很好。这件事我想得太多已经有一段时间了


-Soph

您可以尝试生成真/假vetor,而不是包含0/1的INDI向量。这使得最终过滤更加明显

> data
  col1 col2 col3 col4
1    1    3    1    2
2    3    4    3     
3    1    2          
4    3    3          
5    2        
使用
any
可以轻松访问
1
2
行的内容。第二个
any
将告诉您是否满足这两个条件之一。如果第二个参数设置为1,则
apply()

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   

这将最有效地节省循环并创建
indic
。尽管从
行和(data==“1”| data==“2”)>0发出的真/假向量仍然可以保存在变量中。

我不确定我是否理解这个问题。您想要类似于
finalMatrix
finalMatrix的东西吗?为什么不干脆
data[rowsumes(data==“1”| data==“2”)>0,]
?您没有正确使用矢量化,而且
for
循环的效率非常差。而且,似乎没有理由强制您的值为
字符
;使用
NA
查找缺少的值。
> finalMatrix
  col1 col2 col3 col4
    1    3    1    2
    3    4    3     
    1    2                  
    2    
> data
  col1 col2 col3 col4
1    1    3    1    2
2    3    4    3     
3    1    2          
4    3    3          
5    2        
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   
data[rowSums(data=="1" | data=="2")>0,]