这是一个小型数据集中的一个简单任务,但我有数百万的观察,所以我需要一个非常快的替代方案。
我想创建一个标识alpha-beta对的索引。 Alpha-betas总是成对出现。用这个很容易创建一个循环,但我发现R停止需要很长时间。任何人都知道大数据集的快速解决方案,以便在下面创建正确的列?
id var1 var2 index
A 2 alpha 1
A 3 beta 1
B 5 alpha 2
B 6 beta 2
B 4 alpha 3
B 7 beta 3
C 3 alpha 4
C 5 beta 4
D 4 alpha 5
D 8 beta 5
数据样本:
df <- structure(list(id = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L,
4L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"), var1 = c(2L,
3L, 5L, 6L, 4L, 7L, 3L, 5L, 4L, 8L), var2 = structure(c(1L, 2L,
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("alpha", "beta"), class = "factor")), .Names = c("id",
"var1", "var2"), row.names = c(NA, -10L), class = "data.frame")
答案 0 :(得分:2)
如果列已经订购
library(data.table)
setDT(df)[, indx:= cumsum(var2=='alpha')]
df
# id var1 var2 indx
#1: A 2 alpha 1
#2: A 3 beta 1
#3: B 5 alpha 2
#4: B 6 beta 2
#5: B 4 alpha 3
#6: B 7 beta 3
#7: C 3 alpha 4
#8: C 5 beta 4
#9: D 4 alpha 5
#10: D 8 beta 5
答案 1 :(得分:1)
另一种可能性是使用重复。缺点是var2必须只包含Alpha-Beta对,任何缺失值或其他任何东西,这种方法可能会失败:
df$index <- rep(1:(length(df$var2)/2), each = 2)