簡體   English   中英

將數據幀行強制轉換為R中的矩陣

[英]coercing data frame rows to matrix in R

我不確定要問的是更好的術語,所以請原諒我漫長的方法。

我正在嘗試使用兩個標識變量idduration來填充矩陣的行,其中的列表示半小時的時間段(因此3小時的時間段應為6),而這些行是給定人員在其中的活動時間段。 如果活動未填滿矩陣,則應改用虛擬變量。 我在下面寫了一個示例,應該有助於闡明。

示例:數據有3列,分別是idactivityduration 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM