使用 R 将一个向量的元素分配给另一个向量的元素

Assigning elements of one vector to elements of another with R

我想为每个用户将一个向量的元素分配给另一个向量的元素

例如:

在具有变量“用户”、“活动”和“分钟”(见下文)的数据框中,我想分配,例如,第一个 activity(4 分钟到 activity“读取”)用户 1 到新变量 READ_duration。然后持续时间(5 分钟)秒 activity(“编辑”)到新变量 EDIT_duration。以及第三个 activity(再次“读取”)到新变量 READ_duration.

的持续时间(2 分钟)

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)

输出 应该是这样的:在一个数据框中,为活动分配了分钟数:

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 作为聚合函数对宽格式进行简单的重塑。

准备长格式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