[英]coercing data frame rows to matrix in R
我不确定要问的是更好的术语,所以请原谅我漫长的方法。
我正在尝试使用两个标识变量id
和duration
来填充矩阵的行,其中的列表示半小时的时间段(因此3小时的时间段应为6),而这些行是给定人员在其中的活动时间段。 如果活动未填满矩阵,则应改用虚拟变量。 我在下面写了一个示例,应该有助于阐明。
示例:数据有3列,分别是id
, activity
和duration
。 id和持续时间应作为标识变量, 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:如果添加开始和结束时间而不是持续时间,会更容易吗?
一种方法是通过“ id”每隔30分钟定位一次活动:
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])
}))
并在新的“ data.frame”上:
tapply(as.character(data2$activity), data2[c("id", "ints")], identity)
# ints
#id 0 30 60 90 120 150
# 1 "a" "a" "b" "c" "c" "c"
# 2 "d" "d" "e" NA NA NA
# 3 "b" "b" "b" "a" "a" "a"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.