簡體   English   中英

使用 R 將一個向量的元素分配給另一個向量的元素

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

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