【问题标题】:The for loop doesn't rbind() the vectorsfor 循环不会 rbind() 向量
【发布时间】:2020-05-17 08:17:34
【问题描述】:

我需要有关此 for 循环的帮助。它似乎正在工作,我没有收到任何错误,但最后它不会将向量“row.toadd”插入到每次迭代的数据框中。但是,当我在 for 循环循环之后编写 rbind() 函数时,它会绑定在循环中创建的最后一个向量并将其插入数据帧中。但我希望它为 for 循环中的每次迭代都这样做!当我写“row.toadd”时,最后一次迭代有一个向量,就像我想要的那样,所以它是最后一部分不起作用。我认为这真的很奇怪,因为我之前使用过类似的代码并且它有效。

  for(i in 1:length(event.files)){
event.temp <- fromJSON(file=event.files[i])

shot.index <- which(unlist(lapply(event.temp,function(x) x$type$name))=="Shot")


shots.France <- shot.index[which(unlist(lapply(shot.index,function(x) event.temp[[x]]$team$name))=="France")]

shots.France.df <- data.frame(matrix(NA,nrow=1,ncol=11))
colnames(shots.France.df) <- c("Possession","Player","X.Shot","Y.Shot",
                              "Shot.Type","xG","keypassid","X.KeyPass","Y.KeyPass","Shot.Outcome","Shot.Foot")



if(length(shots.France)!=0){
  for(p in 1:length(shots.France)){
    shots.France.temp <- event.temp[[shots.France[p]]]
    possession <- shots.France.temp$possession
    shooter <- shots.France.temp$player$name
    shots.location <- shots.France.temp$location
    shots.type <- shots.France.temp$shot$technique$name
    shots.xg <- ifelse("statsbomb_xg" %!in% names(shots.France.temp$shot),NA, shots.France.temp$shot$statsbomb_xg)
    keypass <- ifelse("key_pass_id" %!in% names(shots.France.temp$shot),NA,shots.France.temp$shot$key_pass_id)
    keypass.location <- if(!is.na(keypass)){
      as.vector(unlist(pass.team1.df[which(pass.team1.df$passid==keypass),c("X.Pass","Y.Pass")]))
    }else{
      c(NA,NA)
    }
    shots.outcome <- shots.France.temp$shot$outcome$name
    body.part <- shots.France.temp$shot$body_part$name

    row.toadd <- c(possession,shooter,shots.location,shots.type,shots.xg,keypass,keypass.location[1],keypass.location[2],shots.outcome,body.part)

    shots.France[p,] <- row.toadd 
    shots.France.df <- rbind(shots.France.df,row.toadd)
    shots.France.list <- list(shots.France.df)

  }
}
}

【问题讨论】:

  • 如果您将问题分解为基本要素,您可能会更容易获得帮助。哦,是的,如果你提供了一些代表

标签: r dataframe for-loop vector rbind


【解决方案1】:

我不知道你的意思,但我猜你是指代码监听中的内部 for 循环中的以下行。

shots.France.df <- rbind(shots.France.df, row.toadd)

但是,您的外部 for 循环中也有以下代码行。

shots.France.df <- data.frame(matrix(NA,nrow=1,ncol=11))

因此,我猜您只是覆盖了您在内部 for 循环中创建的数据框。因此,我得出结论,如果您移动,该代码将起作用

shots.France.df <- data.frame(matrix(NA,nrow=1,ncol=11))
colnames(shots.France.df) <- c("Possession","Player","X.Shot","Y.Shot",
                          "Shot.Type","xG","keypassid","X.KeyPass","Y.KeyPass","Shot.Outcome","Shot.Foot")

退出for循环。这只是意味着

shots.France.df <- data.frame(matrix(NA,nrow=1,ncol=11))
colnames(shots.France.df) <- c("Possession","Player","X.Shot","Y.Shot",
                         "Shot.Type","xG","keypassid","X.KeyPass","Y.KeyPass","Shot.Outcome","Shot.Foot")


 for(i in 1:length(event.files)){
event.temp <- fromJSON(file=event.files[i])
# Rest of your code.

我希望这会有所帮助。

PS:您下次提问时能否正确格式化代码?您的代码难以阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多