如何控制R?
中data.table中的行索引我想检查一行中的值是否与前一个匹配:
patient produkt output
1 Meg Initiation
1 Meg Continue
1 Gem Switch
2 Pol Initiation
2 Pol Continue
2 Pol Continue
如果输出列是输出,我希望(如果initiation=0, continue=1, switch=2
更容易,那么可以用数字替换。)
我无法找到如何控制data.table中的索引,以下内容不起作用
test[ , switcher2 := identical(produkt, produkt[-1]),by=patient]
欢迎任何想法。它必须在data.table中。
答案 0 :(得分:4)
validates_attachment :attach, :presence => true, :with => %r{\.(rar|tar|zip)$}i, :size => { :in => 0..10.kilobytes}
功能
我在这里使用了shift
表示法,因为它写得比较短但你可以用词来代替
0:2
我基本上总是从每组test[ , output2 := c(0, (2:1)[(produkt == shift(produkt)) + 1][-1]), by = patient]
# patient produkt output output2
# 1: 1 Meg Initiation 0
# 2: 1 Meg Continue 1
# 3: 1 Gem Switch 2
# 4: 2 Pol Initiation 0
# 5: 2 Pol Continue 1
# 6: 2 Pol Continue 1
开始,然后与每组的先前值进行比较。如果0
,则分配TRUE
。如果1
,则分配FALSE
。
如果你想用文字,这里有另外的verison
2
安装说明:
test[ ,output3 := c("Initiation", c("Switch", "Continue")[(produkt == shift(produkt)) + 1][-1]), by = patient]
答案 1 :(得分:2)
这是使用diff
的选项。我正在使用ifelse
将整数值更改为字符。最后,对于每个组,第一个元素设置为初始值。
setDT(dx)[,output := {
xx <- ifelse(c(0,diff(as.integer(factor(produkt))))<0,
"Switch","Continue")
xx <- as.character(xx)
xx[1] <- "Initiation"
xx
},
patient]
# patient produkt output
# 1: 1 Meg Initiation
# 2: 1 Meg Continue
# 3: 1 Gem Switch
# 4: 2 Pol Initiation
# 5: 2 Pol Continue
# 6: 2 Pol Continue