[英]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.