R函数运行,不执行任何操作(显然)

时间:2018-06-22 17:51:08

标签: r function for-loop

我正在尝试使用一个函数,根据向量中的12个元素之一,将单个字母代码分配给数据源变量。这是向量:

> Grps
 [1] "ST"  "RW"  "LW"  "CF"  "CM"  "CDM" "CAM" "RM"  "LM"  "CB"  "RB"  "LB" 

这是函数:$ PrimPos为每一行保存Grps中的值之一,而$ PosGrp是单个字母代码(“ F”,“ M”或“ D”)的目标。

AsgnPos <- function(j, b, e, pos) 
       {for(q in b:e)
           {if(CompleteDataset$PrimPos[j] == Grps[q]) 
           { CompleteDataset$PosGrp[j] <- pos}
       }
}

然后,我遍历数据源(CompleteDataset),对该函数运行三个测试,以查看要分配的代码。 (我知道一旦受到打击,我可以打破常规,但现在它将遍历所有三个测试)。对于该函数,我通过:  j ... CompleteDataset的行号//  b ...该类别的Grps的第一位置//  e ...该类别的Grps的最后位置//  pos ...应用于$ PosGrp //

的字母代码
for(i in 1:17981) {
 if(CompleteDataset$PrimPos[i] == "GK") {
   CompleteDataset$PosGrp[i] <- "G"
 } else {
    AsgnPos(i,1,4, "F")
    AsgnPos(i,5,9, "M")
    AsgnPos(i,10,12, "D")
 }  

}

我希望for例程将执行17981次,对于数据源的每一行一次。第一部分工作正常-对于$ PrimPos中具有“ GK”的任何行,它将“ G”应用于$ PosGrp。我希望依次运行该函数,以检查当前行的$ PrimPos是否与Grps向量的元素之一匹配。完成后,应将字母代码分配给$ PosGrp。

该代码执行时没有明显的错误,但是除了为所有匹配的行分配“ G”之外,它什么都不做。 (我将$ PosGrp字段默认设置为“ Z”,除了将其更改为“ G”以外,它们都仍为“ Z”。)

我已经尝试过调试,但是我是新手,即使我将其作为断点,我也似乎无法使它逐步完成该功能,所以我看不到其中发生了什么。但是我在逻辑上缺少明显的东西吗?

2 个答案:

答案 0 :(得分:1)

这是范围问题。对功能之外的对象进行操作时,请尝试protected TBaseContext(DbContextOptions options) : base(options)

<<-

答案 1 :(得分:0)

OP希望根据PosGrp的值向CompleteDataset添加新变量PrimPos。通过与 lookup 表联接,可以有效地做到这一点。

加入查找表

首先,构造查找表。它将包括所有组,包括"GK"

# as defined by OP
Grps <- c("ST", "RW", "LW", "CF", "CM", "CDM", "CAM", "RM", "LM", "CB", "RB", "LB")

library(data.table)
lookup <- data.table(
  PrimPos = c("GK", Grps), 
  PosGrp = c("G", rep("F", 4L), rep("M", 5L), rep("D", 3L))
)

lookup
    PrimPos PosGrp
 1:      GK      G
 2:      ST      F
 3:      RW      F
 4:      LW      F
 5:      CF      F
 6:      CM      M
 7:     CDM      M
 8:     CAM      M
 9:      RM      M
10:      LM      M
11:      CB      D
12:      RB      D
13:      LB      D

请注意,列名与CompleteDataset中使用的列名相同。这不是必需的,但以后可以节省一些键入。

现在,我们可以将查询表与CompleteDataset联接起来。 R中有不同的选项。名称CompleteDataset听起来很可能是个大数据对象。因此,我建议在连接时使用更新,以在新位置添加 列,以避免复制整个对象。

library(data.table)
setDT(CompleteDataset)[lookup, on = "PrimPos", PosGrp := PosGrp]

使用我的虚拟数据集(请参见下面的数据部分),修改后的

CompleteDataset

包含

          rn PrimPos PosGrp
    1:     1      LW      F
    2:     2      CF      F
    3:     3     CAM      M
    4:     4      RB      D
    5:     5      RW      F
   ---                     
17977: 17977      LW      F
17978: 17978      RB      D
17979: 17979      RB      D
17980: 17980      CM      M
17981: 17981      RW      F

或者,您可以使用基数R

merge(CompleteDataset, lookup)

dplyr

library(dplyr)
left_join(CompleteDataset, lookup)

结果相同,但是如果行和列的顺序可能已更改,则会创建一个新的数据对象。

可复制的虚拟数据集

Grps <- c("ST", "RW", "LW", "CF", "CM", "CDM", "CAM", "RM", "LM", "CB", "RB", "LB")
n_rows <- 17981L
set.seed(1L)
CompleteDataset <- data.frame(
  rn = 1:n_rows,
  PrimPos = sample(c("GK", Grps), n_rows, replace = TRUE),
  stringsAsFactors = FALSE)