从数据框

时间:2016-03-06 14:15:42

标签: r loops

我有几个日志文件,我将其读入一个长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的最优雅方式。

非常感谢!

2 个答案:

答案 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,])

祝你好运!