我正在尝试使用一个函数,根据向量中的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”。)
我已经尝试过调试,但是我是新手,即使我将其作为断点,我也似乎无法使它逐步完成该功能,所以我看不到其中发生了什么。但是我在逻辑上缺少明显的东西吗?
答案 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)