【问题标题】:Using subsets and whole dataframes simultaneously in a loop在循环中同时使用子集和整个数据帧
【发布时间】:2018-06-20 01:30:56
【问题描述】:

我正在尝试编写一个循环遍历数据帧行并使用有关其他行的信息来确定每个循环的输出的函数。

考虑以下数据框,它表示具有经度坐标、纬度坐标和表示他们是否生病的值的人:

game.mat<-as.data.frame(matrix(0, nrow = 100, ncol = 3))
colnames(game.mat)<-c("PosX","PosY","Sick")
game.mat[,"PosX"]<-sample(x = c(1:100), 100, replace = TRUE)
game.mat[,"PosY"]<-sample(x = c(1:100), 100, replace = TRUE)
game.mat[,"Sick"]<-sample((c(rep(0,8),rep(1,2))),100,replace=TRUE)

在基线时,少数人会生病。我的功能是感染与病人有相邻 x-y 坐标的人(因此任何与病人相邻的人)。我考虑在 ifelse 语句中嵌入这样的函数:

 search_sick<-function(d,corx,cory){
   d2<-d[d$PosX<corx+2&d$PosX>corx-2&d$PosY<cory+2&d$PosY>cory-2,]
   if(sum(d2$Sick>0)){
    d$Sick<-1
   } else{
    d$Sick<-0
   }
  } 

但它会让每个人都生病,也许是因为如果有人在病人旁边,它会给每个人一个 1 的值。我还考虑过使用应用功能。但是根据我对 apply 的了解,它一次只能在一行内运行,因此无法检索有关其他行是否具有相邻坐标值的信息。

我希望这是有道理的。很高兴提供任何其他信息。

【问题讨论】:

  • 我不确定我是否理解您尝试使用的逻辑。 corxcory 是否意味着用户输入函数的空间中的单个点?或者您想同时搜索所有感染者?或者是其他东西?我已经为下面的第一种情况提供了解决方案,但如果这不是您想要的,请告诉我。
  • 我想同时搜索所有感染者。这就是我遇到的问题。

标签: r if-statement apply


【解决方案1】:

这是一个使用apply的例子

set.seed(1)

game.mat<-as.data.frame(matrix(0, nrow = 100, ncol = 3))
colnames(game.mat)<-c("PosX","PosY","Sick")
game.mat[,"PosX"]<-sample(x = c(1:100), 100, replace = TRUE)
game.mat[,"PosY"]<-sample(x = c(1:100), 100, replace = TRUE)
game.mat[,"Sick"]<-sample((c(rep(0,8),rep(1,2))),100,replace=TRUE)

#plot the sick individuals in red
plot(PosY~PosX, data=game.mat, col=as.factor(Sick), pch=16) 

我们将修改您的函数,使其具有灵活的搜索半径“r”,并返回新感染个体的索引

search_sick<-function(d, corx, cory, r){
  indx<-which(d$PosX<corx+r & d$PosX>corx-r & d$PosY<cory+r & d$PosY>cory-r)
}

contagious<-game.mat[game.mat$Sick==1,]

infected<-apply(contagious, 1, function(x) {
  search_sick(game.mat, x[1], x[2], r=10)
})

game.mat$T1<-game.mat$Sick

game.mat$T1[unique(unlist(infected))]<-1

#circle points which have become sick
points(PosY~PosX, data=game.mat[game.mat$Sick==0 & game.mat$T1==1,], col="red", cex=2) 

【讨论】:

  • 谢谢!这是一种不错且优雅的方法。虽然理想情况下,我将能够轻松地遍历数据帧的行,为函数提供所有患病个体的坐标,并在不断更新数据帧的同时独立运行这些坐标的函数。这一点尤其重要,因为函数嵌入在 for 循环中,所以我需要自动输入坐标,而不是自己输入。
  • 感谢您的澄清,我已经相应地更新了我的答案。
猜你喜欢
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2021-07-05
  • 2022-12-20
  • 1970-01-01
相关资源
最近更新 更多