在R

时间:2017-04-24 16:05:12

标签: r

我不确定我的问题有更好的术语,所以请原谅我长篇大论的方法。

我正在尝试使用两个识别变量idduration来填充矩阵的行,其中列表示半小时周期(因此3小时内应该有6个)并且行是这些时间段内给定人员的活动。如果活动没有填满矩阵,则应使用虚拟变量。我在下面写了一个例子来帮助澄清。

实施例: 数据有3列,idactivityduration。 id和duration应作为标识变量,activity应作为矩阵中的变量。

data <- data.frame(id = c(1, 1, 1, 2, 2, 3, 3, 3), 
               activity = c("a", "b", "c", "d", "e", "b", "b", "a"), 
               duration = c(60, 30, 90, 45, 30, 15, 60, 100))

对于该示例,我使用了3小时的持续时间,因此矩阵中有6列。下面的矩阵是想要的输出。存在DUMMY个实例,其中一个人的活动的总持续时间不与矩阵的持续时间相加。在此示例中,总持续时间为180(3小时* 60),因此活动持续时间总和为75(45 + 30)的人2将在完成前75分钟的活动后获得DUMMY变量。

mat <- t(matrix(c("a", "a", "b", "c", "c", "c",
            "d", "d", "e", "DUMMY", "DUMMY", "DUMMY",
            "b", "b", "b", "a", "a", "a"), 
          nrow = 6, ncol = 3))
colnames(mat) <- c("0", "30", "60", "90", "120", "150")

我不确定如何使用上面的数据填充上面的矩阵mat。任何帮助,将不胜感激。如果问题需要更清楚,请告诉我。

编辑:编辑输出

EDIT2:添加了矩阵列名称

EDIT3:添加了关于虚拟变量的信息

EDIT4:如果我添加开始和结束时间而不是持续时间会更容易吗?

1 个答案:

答案 0 :(得分:1)

一种方法是通过&#34; id&#34;来定位每30分钟间隔的活动:

list(APPEND VALGRIND_CMD "$<TARGET_FILE:${TEST_NAME}>")

add_custom_command(
    OUTPUT
        ${PASSED_FILE}
    COMMAND
        ${CMAKE_COMMAND} -E echo \"${VALGRIND_CMD}\" > ${OUTPUT_FILE}
    COMMAND
        ${VALGRIND_CMD} >> ${OUTPUT_FILE} 2>&1 || (cat ${OUTPUT_FILE} && false)
    COMMAND
        ${CMAKE_COMMAND} -E touch ${PASSED_FILE}
    COMMENT
        "Running ${ARG_NAME} tests"
    USES_TERMINAL
)

关于新的&#34; data.frame&#34;:

ints = seq(0, by = 30, length.out = 6)

data2 = do.call(rbind, 
            lapply(split(data, data$id),
                   function(d) {
                      dur = d$duration
                      i = findInterval(ints, c(cumsum(c(0, dur[-length(dur)])), sum(dur))) 
                      data.frame(id = d$id[1], ints = ints, activity = d$activity[i])
                    }))