使用RevoScaleR对每个组进行行数计算

使用RevoScaleR对每个组进行行数计算,r,revolution-r,R,Revolution R,我正在转换一个本地R脚本,以利用Revolution-R(又名Microsoft R客户端/服务器)包中的RevoScaleR函数。这是为了能够更好地扩展大量数据 目标是创建一个新列,对每个组的行进行编号。使用数据。表这将使用以下代码实现: library(data.table) eventlog[,ActivityNumber := seq(from=1, to=.N, by=1), by=Case.ID] 出于说明目的,输出如下所示: Case.ID ActivityNumb

我正在转换一个本地R脚本,以利用Revolution-R(又名Microsoft R客户端/服务器)包中的
RevoScaleR
函数。这是为了能够更好地扩展大量数据

目标是创建一个新列,对每个组的行进行编号。使用
数据。表
这将使用以下代码实现:

library(data.table)
eventlog[,ActivityNumber := seq(from=1, to=.N, by=1), by=Case.ID]
出于说明目的,输出如下所示:

    Case.ID    ActivityNumber
1       A              1
2       A              2
3       B              1
4       C              1
5       C              2
6       C              3
在使用
rx
-函数进行一些研究之后,我发现了包
dplyrXdf
,它基本上是一个包装器,可以在
Xdf
存储数据上使用
dplyr
函数,同时仍然受益于
RevoScaleR
的优化功能(请参阅)

就我而言,这将导致以下情况:

result <- eventlog %>%
  group_by(Case.ID) %>%
  mutate(ActivityNumber = seq_len(n()))

有没有办法解决这个错误?或者其他(更好的?)方法来获得要求的结果?

dplyr
dplyrXdf
有一个
计数方法来计算每组的项目:

result <- eventlog %>%
  group_by(Case.ID) %>%
  tally()
第二个例子:

rxCube(delay ~ Case.ID, data = eventlog)

我不知道为什么会这样,但请尝试使用
seq\u-along(Case.ID)
而不是
seq\u-len(n())


感谢@Matt parker为我指出这个问题

请注意,
n()。它需要专门针对每个数据源实施,也可能针对
mutate
summary
filter
中的每一个单独实施

目前,xdf文件支持的
n
的唯一用法是在
summary
中,用于计算行数。为其他动词实现它实际上是不平凡的

特别是,Matt使用
seq_沿途
来实现
n
的功能存在问题。请记住,xdf文件是块结构的:每个行块都是独立于其他块读取和处理的。这意味着生成的序列仅针对该行块,而不是一个组中的所有行。如果一个组跨越一个以上的块,序列号将在中间重新启动。 获取正确序列号的方法是保持一个运行计数,记录您为该组读入的行数,并在每次处理块时更新它。可以使用
transformFunc
执行此操作,通过
.rxArgs
参数将其传递给
transmute

ev <- eventlog %>% group_by(Case.ID) %>% transmute(.rxArgs = list(
    transformFunc = function(varList) {
        n <- .n + seq_along(varList[[1]])
        if(!.rxIsTestChunk)  # need this b/c rxDataStep does a test run on the 1st 10 rows
            .n <<- n[length(n)]
        list(n=n)
    },
    transformObjects = list(.n = 0))
ev%group\u by(Case.ID)%%>%transmute(.rxArgs=list)(
transformFunc=函数(变量列表){

n感谢您对此进行研究,但这并不能回答我的问题。我不想得到每组的记录总数,我想对每组的记录进行编号。请参阅data.table中的所需输出。group_by仅用于评估编号从0开始的位置。它确实有效。奇怪的是,它有些错误times在较大的数据集上失败(给出与n()完全相同的错误)。我不知道是dplyrXdf还是其他原因造成的。。。
rxCrossTabs(~ Case.ID, data = eventlog)
rxCube(delay ~ Case.ID, data = eventlog)
result <- eventlog %>%
  group_by(Case.ID) %>%
  mutate(ActivityNumber = seq_along(Case.ID))
options(stringsAsFactors = FALSE)

library(dplyrXdf)

# Set up some test data
eventlog_df <- data.frame(Case.ID = c("A", "A", "A", "A", "A", "B", "C", "C", "C"))

# Add a variable for artificially splitting the XDF into small chunks
eventlog_df$Chunk.ID <- factor((seq_len(nrow(eventlog_df)) + 2) %/% 3)

# Check the results
eventlog_df


# Now read it into an XDF file. I'm going to read just three rows in at a time
# so that the XDF file has several chunks, so we can be confident this works
# across chunks

eventlog <- tempfile(fileext = ".xdf")

for(i in 1:3) {
    rxImport(inData = eventlog_df[eventlog_df$Chunk.ID %in% i, ],
             outFile = eventlog,
             colInfo = list(Case.ID = list(type = "factor", 
                                           levels = c("A", "B", "C"))),
             append = file.exists(eventlog))
}

# Convert to a proper data source
eventlog <- RxXdfData(eventlog)

rxGetInfo(eventlog, getVarInfo = TRUE, numRows = 10)


# Now to dplyr. First, let's make sure it can count up the records
# in each group without any trouble.
result <- eventlog %>%
  group_by(Case.ID) %>%
  summarise(ActivityNumber = n())

# It can:
rxDataStep(result)


# Now if we switch to mutate, does n() still work?
result <- eventlog %>%
  group_by(Case.ID) %>%
  mutate(ActivityNumber = n())

# No - and it seems to be complaining about missing variables. So what if
# we try to refer to a variable we *know* exists?
result <- eventlog %>%
  group_by(Case.ID) %>%
  mutate(ActivityNumber = seq_along(Case.ID))

# It works
rxDataStep(result)
ev <- eventlog %>% group_by(Case.ID) %>% transmute(.rxArgs = list(
    transformFunc = function(varList) {
        n <- .n + seq_along(varList[[1]])
        if(!.rxIsTestChunk)  # need this b/c rxDataStep does a test run on the 1st 10 rows
            .n <<- n[length(n)]
        list(n=n)
    },
    transformObjects = list(.n = 0))