【问题标题】:creating abstract names and summarizing time variables创建抽象名称和汇总时间变量
【发布时间】:2017-02-06 22:36:42
【问题描述】:

我有一个数据框,我想将其中一列转换为字母 A、B、C、D 并创建一个汇总时间:

ticket <- c('1-5444', '1-5444', '1-5444', '1-5444', '1-5444', '1-5444', '1-5445')
person <- c('John','John','Kai', 'John', 'Kai', 'Bob', 'John')
time<- c(NA, 1, 2,1, 3, 4, NA)
df <- data.frame(ticket,person,time)

我想创建一个名为z 的抽象变量,它将为person 列获取一个抽象值。例如,在John-John-Kai-John-Kai-Bob 中,基本上有三个人,因此,A-A-B-A-B-C。所以z会取对应actor的值,如下所示:

     ticket     person    time   z  ztime 
     1-5444      John     NA     A    2 
     1-5444      John     1      A    2
     1-5444      Kai      2      B    5
     1-5444      John     1      A    2
     1-5444      Kai      3      B    5
     1-5444      Bob      4      C    4
     1-5445      John     NA     A    0

然后我想计算 ztime,它告诉每个人花费的时间总和。有什么想法吗?

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    使用StringsAsFactors = TRUE(默认)创建数据框,已经创建了具有3个不同级别的变量person。您所需要的只是创建新变量:

    df <- transform(df,
      z = LETTERS[person],
      ztime = by(time, person, sum, na.rm = TRUE)[person]
    )
    

    或者(根据 cmets 的要求)如果按人和票分组:

    df <- transform(df,
      z = LETTERS[person],
      ztime = ave(time, ticket, person, FUN = function(x) sum(x, na.rm = TRUE))
    )
    

    【讨论】:

    • 我在 z 列中得到一个名为 NA 的奇怪值,如果我遗漏了什么,请告知
    • 我猜你的 person 字段不是一个因素。数据框的创建方式不同 - 您的会话也可能使用 stringsAsFactors = FALSE 选项设置。请与getOption("stringsAsFactors") 联系。您也可以通过df$person &lt;- factor(df$person) 将变量更改为因子
    • 我已将其更改为因素。我还有一个票号,所以每个票的人都不同,所以我们在对这些值进行分组时可能必须考虑到这一点。你怎么看?人数可以是无限的,但一张票少于 26 个字符
    • 很抱歉,但我不知道这里到底是什么问题。使用因子时,字符数不是问题。
    • 我明白了,谢谢。我希望在每张票后重置字母
    【解决方案2】:

    可以分两步完成。

    values <- c("C", "A", "B")
    df$z <- values[df$person]
    aggr = ddply(df,.(ticket,person),summarize, ztime=sum(time,na.rm=T))
    df = join(df,aggr,by=c("ticket","person"),type="left")
    View(df)
    
      ticket person time z ztime
    1 1-5444   John   NA A     2
    2 1-5444   John    1 A     2
    3 1-5444    Kai    2 B     5
    4 1-5444   John    1 A     2
    5 1-5444    Kai    3 B     5
    6 1-5444    Bob    4 C     4
    7 1-5445   John   NA A     0
    

    【讨论】:

      【解决方案3】:

      使其通用并自动适应不同人数:

      1. 获取使用uniques()的人数
      2. 生成字母列表(参见post
      3. 使用list() 创建关联列表
      4. 按照上一个答案加入
      5. dyplyr 聚合

      【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 2021-06-30
      • 2018-12-26
      • 1970-01-01
      • 2017-12-30
      • 2017-10-03
      • 1970-01-01
      • 2020-11-27
      相关资源
      最近更新 更多