gpt4 book ai didi

r - 删除数据框中的行,这些行在另一个数据框的相应行中具有特定值

转载 作者:行者123 更新时间:2023-12-04 19:50:35 27 4
gpt4 key购买 nike

我有两个数据框。

第一个保存我的实际数据,我们称之为数据。第二个用作指示矩阵,它是使用 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

data 的行必须包含至少一个 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,这已被indic证实。

我想删除 data 中的第 2 行和第 4 行,它们对应于 indic 中的第 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

这仅有效地消除了第四行。我认为这可能与我必须在每次迭代后创建一个新数据框这一事实有关,但问题是迭代长度会发生变化。

想知道我的代码是否走在正确的轨道上……任何建议都会很好。一段时间以来,我一直在考虑这个问题。

-索夫

最佳答案

您可以尝试生成一个 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 会告诉您。如果第二个参数设置为 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-vector 也可以应用于另一个数据框,但在这里重要的是要注意数据框和 indic-vector 具有相同的维度或旨在向量回收。

采纳@nicola 关于使用矢量化的建议。

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

这将最有效地完成工作,节省循环并创建 indic。尽管从 rowSums(data=="1"| data=="2")>0 发出的 TRUE/FALSE 向量仍然可以保存在变量中。

关于r - 删除数据框中的行,这些行在另一个数据框的相应行中具有特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43851936/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com