[英]Assigning elements of one vector to elements of another with R
我想為每個用戶將一個向量的元素分配給另一個向量的元素。
例如:
在具有變量“用戶”、“活動”和“分鍾”(見下文)的數據框中,我想分配例如第一個活動的持續時間(4 分鍾)(4 分鍾到活動“閱讀” ) 的用戶 1 到新變量 READ_duration。 然后將第二個活動(“EDIT”)的持續時間(5 分鍾)添加到新變量 EDIT_duration。 第三個活動的持續時間(2 分鍾)(同樣是“READ”)到新變量 READ_duration。
user <- 1,2,3
activities <- c("READ","EDIT","READ"), c("READ","EDIT", "WRITE"), c("WRITE","EDIT")
minutes <- c(4,5,2), c(3.5, 1, 2), c(4.5,3)
Output應該像:在分配了活動分鍾數的數據框中:
user READ_duration EDIT_duration WRITE_duration
1 6 5 0
2 3.5 1 2
3 0 3 4.5
這里的棘手之處在於算法需要考慮每個用戶的活動順序不同。 例如,用戶 3 從寫入開始,因此需要將持續時間 4.5 分配給第 4 列 WRITE_duration。
此外,由於大量用戶,將需要循環功能。
非常感謝你的幫助!!
這需要簡單地重塑為寬格式,並將sum
作為聚合 function。
准備一個長格式的data.frame:
user <- c(1,2,3)
activities <- list(c("READ","EDIT","READ"), c("READ","EDIT", "WRITE"), c("WRITE","EDIT"))
minutes <- list(c(4,5,2), c(3.5, 1, 2), c(4.5,3))
DF <- Map(data.frame, user = user, activities = activities, minutes = minutes)
DF <- do.call(rbind, DF)
# user activities minutes
#1 1 READ 4.0
#2 1 EDIT 5.0
#3 1 READ 2.0
#4 2 READ 3.5
#5 2 EDIT 1.0
#6 2 WRITE 2.0
#7 3 WRITE 4.5
#8 3 EDIT 3.0
重塑:
library(reshape2)
dcast(DF, user ~ activities, value.var = "minutes", fun.aggregate = sum)
# user EDIT READ WRITE
#1 1 5 6.0 0.0
#2 2 1 3.5 2.0
#3 3 3 0.0 4.5
在基礎 R 你可以這樣做:
xtabs(min~ind+values, cbind(stack(setNames(activities, user)), min = unlist(minutes)))
values
ind EDIT READ WRITE
1 5.0 6.0 0.0
2 1.0 3.5 2.0
3 3.0 0.0 4.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.