创建抽象名称和总结时间变量

creating abstract names and summarizing time variables

我有一个数据框,我想将其中一列转换为字母 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 将采用相应角色的值,如下所示:

     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,它告诉每个人花费的时间总和。有什么想法吗?

可以分两步完成。

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

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

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

或者(按照评论中的要求)如果按人和票分组:

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

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

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