将名称和时间数据从(每次名称内的)重整为(每个名称所有时间的)

时间:2018-08-17 20:20:24

标签: r aggregate

我正在尝试使用R重塑活动的注册表。

当前,每列代表一个时间段(例如:9-11AM,11 AM-1PM等),每列中的每一行都是联系人电子邮件。一些联系人只注册了一段时间,而另一些则注册了多个:

    9-11            11-1            1-3              3-5
xxx@email.com  zzz@email.com   zzz@email.com    xxx@email.com
yyy@email.com  yyy@email.com   yyy@email.com    yyy@email.com

我调整了数据的形状,使每封电子邮件一次都与一个时隙配对:

xxx@email.com  "9-11"
yyy@email.com  "9-11"
zzz@email.com  "11-1"
yyy@email.com  "11-1"
zzz@email.com  "1-3"
yyy@email.com  "1-3"
xxx@email.com  "3-5"
yyy@email.com  "3-5"

为了为邮件合并发送每个作业做准备,我想重塑数据,以便每个电子邮件观察都与计划它们的所有作业配对(例如:1、2、3或全部)放在data.frame对象中:

xxx@email.com   "9-11" , "3-5
yyy@email.com   "9-11" , "11-1" , "1-3", "3-5"
zzz@email.com   "11-1" , "1-3"

我当前的代码是:

assignments_final <- sapply(split(assignments[-1], assignments[1]), function(X) unname(unlist(X))) 
 # combine all time slots assigned to the same person into one list 

df <- data.frame()
 # create data frame to add each list object

for (i in 1:length(assignments_final)) {
  df <- rbind(df, assignments_final[[i]])
  }
# for each observation, add contact and all assignments to a new row

但是,这段代码给了我一个错误:“ In [<-.factor*tmp*,ri,value =” 9-11“):   无效的因子水平,生成了NA”

返回的数据帧仅包含是否每个人都被分配给第一人的一个班次(例如:如果第一人被分配给9-11和11-1的班次,则有两列;如果此人签了名,则每一列都包含该班次;否则,则为NA。

我该如何解决这个问题,以便有n个不同的列,对于每个未分配此人的班次,每个班次都标记为NA,或者所有班次都列在一栏中?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用aggregate

> aggregate(V2~V1, data=df, FUN=paste0)
             V1                   V2
1 xxx@email.com            9-11, 3-5
2 yyy@email.com 9-11, 11-1, 1-3, 3-5
3 zzz@email.com            11-1, 1-3

数据:

df <- read.table(text="xxx@email.com  9-11
yyy@email.com  9-11
                 zzz@email.com  11-1
                 yyy@email.com  11-1
                 zzz@email.com  1-3
                 yyy@email.com  1-3
                 xxx@email.com  3-5
                 yyy@email.com  3-5", header=FALSE)