使用 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
我想为每个用户将一个向量的元素分配给另一个向量的元素。
例如:
在具有变量“用户”、“活动”和“分钟”(见下文)的数据框中,我想分配,例如,第一个 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