【问题标题】:Assigning elements of one vector to elements of another with R用 R 将一个向量的元素分配给另一个向量的元素
【发布时间】:2020-06-23 06:54:56
【问题描述】:

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

例如:

在具有变量“用户”、“活动”和“分钟”(见下文)的数据框中,我想分配例如第一个活动的持续时间(4 分钟)(活动 4 分钟)用户 1 的 "READ") 到新变量 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)

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

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。

另外,由于用户数量庞大,需要循环功能。

非常感谢您的帮助!!

【问题讨论】:

    标签: r vector element assign


    【解决方案1】:

    这需要使用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
    

    【讨论】:

    • 顺便感谢您的反馈!它正在工作! :) 现在我只需要了解它如何处理我的数据集,该数据集由列表组成,它们又由列表等组成。
    【解决方案2】:

    在基础 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多