R 删除数据帧中在另一数据帧的对应行中具有特定值的行
我有两个数据帧 第一个保存我的实际数据,我们称之为数据。第二个用作指示符矩阵,它使用if-else语句构造,该语句检查至少包含1或2的值行的出现情况,我们称之为indic 以下是一个例子: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
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发出的真/假向量仍然可以保存在变量中。我不确定我是否理解这个问题。您想要类似于finalMatrixfinalMatrix的东西吗?为什么不干脆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,]