创建抽象名称并汇总时间变量

时间:2017-02-06 22:36:42

标签: r dplyr tidyr

我有一个数据框,我想将其中一个列转换为字母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,它告诉每个人服用的时间总和。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

使用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 :(得分:1)

可以分两步完成。

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

答案 2 :(得分:0)

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

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