我有几个日志文件,我将其读入一个长data.frame(日志文件1后跟日志文件2等)。演示变量的样子:
Event.Type
Picture
Response
Picture
Response
Response
Response
Picture
Response
Response
换句话说,模式是一个Picture
到一个或多个Response
s。我目前的目标是提取每张图片,然后是第一个响应,即:
Picture
Response
Picture
Response
...
到目前为止,我最成功的尝试是提取所有图片:
picrows <- which(bps$Event.Type=="Picture")
output <- bps[picrows,]
write.table(output, file='bps.tab')
之后我尝试用循环添加每个图片行后面的行,这似乎不起作用:
i=1
for (i in 1:length(bps))
{
picrows[i] <- which(bps$Event.Type=="Picture")
output <- rbind(bps[picrows[i],], bps[picrows[i+1],])
write.table(output, file='bps.tab')
i = i+1
}
output
这拍摄了第一张图片行,并在表格中添加了一张看似随机的其他图片行,即共有两行。我的想法出了什么问题?除了循环显然不是继续使用R的最优雅方式。
非常感谢!
答案 0 :(得分:2)
你可以这样做(不需要循环):
# get indices of pictures:
i <- which(d$Event.Type == "Picture")
# subset rows in i and i+1:
d[sort(c(i, i+1)),, drop =FALSE]
# Event.Type
#1 Picture
#2 Response
#3 Picture
#4 Response
#7 Picture
#8 Response
您可以逐步运行这些行来检查发生了什么:
i
#[1] 1 3 7
i+1
#[1] 2 4 8
c(i, i+1)
#[1] 1 3 7 2 4 8
sort(c(i, i+1))
#[1] 1 2 3 4 7 8
可重复形式的样本数据:
d <- structure(list(Event.Type = structure(c(1L, 2L, 1L, 2L, 2L, 2L,
1L, 2L, 2L), .Label = c("Picture", "Response"), class = "factor")), .Names = "Event.Type", class = "data.frame", row.names = c(NA,
-9L))
我将使用d2
作为第二个示例数据集,其中一个“图片”没有直接后跟“响应”:
d2 <- d[-2, , drop=FALSE]
a)如果您不确定每个“图片”后面是否至少有1个“响应”,您可以执行以下操作以避免多次返回某些图片(但无论如何都会返回所有图片)他们是否跟着“回应”):
i <- which(d2$Event.Type == "Picture")
ii <- c(i, intersect(i+1, which(d2$Event.Type == "Response")))
d2[sort(ii),, drop =FALSE]
# Event.Type
#1 Picture
#3 Picture
#4 Response
#7 Picture
#8 Response
b)如果您只想返回那些后跟至少1个“响应”的“图片”行,您可以使用以下修改:
i <- which(d2$Event.Type == "Picture")
ii <- c(i, i+1)[d2$Event.Type[i+1] == "Response"]
d2[sort(ii),, drop =FALSE]
# Event.Type
#3 Picture
#4 Response
#7 Picture
#8 Response
答案 1 :(得分:0)
我想到了两个想法:
rbind:如果要继续将行附加到输出var,请将其包含为第一个参数。
output <- rbind(output, bps[picrows[i],], bps[picrows[i+1],])
picrows只有Picture行索引。也许你想在原来的picus [i]中加1,如下所示,而不是[i + 1]:
output <- rbind(output, bps[picrows[i],], bps[picrows[i]+1,])