基于单个字段展开data.frame行

基于单个字段展开data.frame行,r,reshape,R,Reshape,我有一个简单的数据集,格式如下: From,To,Date,Subject 我希望对该数据进行重新调整,使其线条如下: e1,e2;e3;e4,d1,s1 也得到扩展: e1,e2,d1,s1 e1,e3,d1,s1 e1,e4,d1,s1 现在,我通过数据帧上的for循环完成了这项工作,并在运行中构建了一个新的数据帧,但我想知道是否还有更多的“R”方式来完成这项工作 编辑: 这就是我目前拥有的,它可以工作,但有点难看(并且显示出我仍然有点有限的R技能): filteredEmailsEx

我有一个简单的数据集,格式如下:

From,To,Date,Subject
我希望对该数据进行重新调整,使其线条如下:

e1,e2;e3;e4,d1,s1
也得到扩展:

e1,e2,d1,s1
e1,e3,d1,s1
e1,e4,d1,s1
现在,我通过数据帧上的for循环完成了这项工作,并在运行中构建了一个新的数据帧,但我想知道是否还有更多的“R”方式来完成这项工作

编辑: 这就是我目前拥有的,它可以工作,但有点难看(并且显示出我仍然有点有限的R技能):


filteredEmailsExpanded首先展开数据帧(称为
d
),重复第i行n(i)次,其中n(i)是“;”的出现次数在
d$To[i]
中,然后用这些事件替换
d$To
?为了更好地说明这一点,我在示例数据中增加了一行

d <- data.frame(
        From = c("e1", "e5"), 
        To = c("e2;e3;e4", "e6;e7"),
        Date = c("d1", "d2"),
        Subject = c("s1", "s2"),
        stringsAsFactors = FALSE)

v <- strsplit(d$To, ";")
lengths <- sapply(v, length)
d <- d[rep(1:nrow(d), lengths), ]
d$To <- unlist(v)

d您可能想看看我的“splitstackshape”包,特别是带有“long”参数的函数
concat.split.multiple

使用@konvas的示例数据,尝试:

library(splitstackshape)
concat.split.multiple(d, "To", ";", "long")
#   From Date Subject time   To
# 1   e1   d1      s1    1   e2
# 2   e5   d2      s2    1   e6
# 3   e1   d1      s1    2   e3
# 4   e5   d2      s2    2   e7
# 5   e1   d1      s1    3   e4
# 6   e5   d2      s2    3 <NA>

请显示实际的代码,因为这不是很清楚是的,这正是我仍然缺乏和正在寻找的那种R-欺骗。回答得很好,直截了当!对所述问题的有趣补充。事实上,用更少的代码行解决了我的问题(很好!),但代价是额外的依赖关系。@BertjanBroeksema,而且速度很快:-)
library(splitstackshape)
concat.split.multiple(d, "To", ";", "long")
#   From Date Subject time   To
# 1   e1   d1      s1    1   e2
# 2   e5   d2      s2    1   e6
# 3   e1   d1      s1    2   e3
# 4   e5   d2      s2    2   e7
# 5   e1   d1      s1    3   e4
# 6   e5   d2      s2    3 <NA>
## cSplit(indt = d, splitCols = "To", sep = ";", direction = "long")
cSplit(d, "To", ";", "long")
#    From To Date Subject
# 1:   e1 e2   d1      s1
# 2:   e1 e3   d1      s1
# 3:   e1 e4   d1      s1
# 4:   e5 e6   d2      s2
# 5:   e5 e7   d2      s2