【问题标题】:loop only provides the first output循环只提供第一个输出
【发布时间】:2020-02-26 19:32:01
【问题描述】:

这是数据。所以这些是火车站:

   TwentyFourSeptTrainData

   $PTCAR_LG_NM_NL
   ALPHA
   BRAVO
   CHARLIE
   DELTA
   ECHO
   FOXTROT
   ALPHA
   BRAVO
   etc. etc.

所以对于每个火车站,我想运行下面的循环,以便值 c 变为 Station1 或 Station2,具体取决于行。

所以我首先必须逐行将 b 定义为该列中的每个火车站。 然后我需要确保对于 b 中的每一行,我得到一个对应的 c。

  for (b in TwentyFourSeptTrainData$PTCAR_LG_NM_NL) {

  if (b=='CHARLIE' | b=='ALPHA'){ 
  c = 'Station1'
  }  
  else if (b==BRAVO | b=='DELTA' | b=='ECHO' | b=='FOXTROT'){
  c = 'Station2'
  }      
  }
  print(c)

因为在那之后,我需要在需要 c 的每个输出的每一行上运行一个 函数

但是当我将 b (在运行循环之前)预定义为

b

之后,我打印(c),但它只给我一个输出;第一个。我认为我在索引方面做错了。我做错了什么?

【问题讨论】:

  • 您每次通过循环时都会不断替换c 的值。我认为您根本不需要循环,您最好使用ifelse 函数。也许像ifelse(TwentyFourSeptTrainData$PTCAR_LG_NM_NL %in% c('CHARLIE','ALPHA'), "Station1", "Station2")
  • 如果我有 3 个站点怎么办?所以:Station1,Station2,Station3。 ALPHA 在 Station3 会在哪里?
  • 你可以嵌套ifelse()语句或从dplyr切换到case_when

标签: r loops indexing


【解决方案1】:

如果您在 for 循环之前将 c 初始化为空列表,它会起作用吗?即

c = c()
for (b in TwentyFourSeptTrainData$PTCAR_LG_NM_NL) {
    if (b=='CHARLIE' | b=='ALPHA'){ 
        c = c(c, 'Station1')
  }  
    else {
        c = c(c, 'Station2')
  }      
}
print(c)

【讨论】:

    【解决方案2】:

    我建议你在 R 中使用矩阵操作而不是使用循环:

    #create data-frame
    df <- data.frame(b = c("ALPHA", "BRAVO","CHARLIE", "DELTA", "FOXTROT", "ALPHA", "BRAVO" ))
    df
      b
    1   ALPHA
    2   BRAVO
    3 CHARLIE
    4   DELTA
    5 FOXTROT
    6   ALPHA
    7   BRAVO
    
    #matrix manipulation
    df$c[df$b == "CHARLIE" | df$b== "ALPHA"] <- "Station 1"
    df$c[df$b == "BRAVO" | df$b == "DELTA" | df$b == "ECHO" | df$b == "FOXTROT"] <- "Station 2"
    df
            b         c
    1   ALPHA Station 1
    2   BRAVO Station 2
    3 CHARLIE Station 1
    4   DELTA Station 2
    5 FOXTROT Station 2
    6   ALPHA Station 1
    7   BRAVO Station 2
    

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      相关资源
      最近更新 更多