如何识别R中每个变量的开头和结尾

时间:2014-03-25 15:40:29

标签: r

我对R很新,并尝试开始组织我的数据集。

我正在研究从行为实验视频编码的观察数据。输出是一列,所有条目按时间顺序列出,如下所示:

SD3
No string start
Open lid
End state
End trial
String start
Open lid
End state
End trial
String start
Touch knob A
Remove string
Open lid
End state
End trial
No string start
Open lid
End state
Clapping hands
End trial
SD4
String start
Touch knob B
Touch knob B
Touch knob B
Open lid
End state
End trial
No string start
Touch knob B
Touch knob A
Remove string
Remove string
Touch knob B
End trial
No string start
Open lid
End state
End trial
String start
Touch knob B
Touch knob A
Remove string
Touch knob B
End trial

这是带有拼写标签的版本,但当然这些可以很容易地用单个字母或数字代替。

为了分析数据,我需要将此列划分为不同的组。我已经在Excel中完成了它,但它需要很多时间,需要手动完成一些步骤。我想在R中找到一种实用的方法,但我还没有找到它。

我认为我需要的是一种根据该行之前/之后的内容为每一行分配新变量的方法。 Es。:SD3之后的所有行(ID标签)但在SD4之前,需要分配一个" SD3"变量(稍后根据此分组)。

我更难以处理的是将专栏分成更小的组:每个参与者进行4次试验。我需要将每个试验分开(用新变量识别/将其放入单独的列或其他类似的解决方案中,以便以后可以单独分析)。

在上面的例子中,我需要有这样的输出:

SD3
No string start -- SD3 -- trial1
Open lid -- SD3 -- trial1
End state -- SD3 -- trial1
End trial -- SD3 -- trial1
String start -- SD3 -- trial2
Open lid -- SD3 -- trial2
End state -- SD3 -- trial2
End trial -- SD3 -- trial2
String start -- SD3 -- trial3
Touch knob A -- SD3 -- trial3
Remove string -- SD3 -- trial3
Open lid -- SD3 -- trial3
End state -- SD3 -- trial3
End trial -- SD3 -- trial3
No string start -- SD3 -- trial4
Open lid -- SD3 -- trial4
End state -- SD3 -- trial4
Clapping hands -- SD3 -- trial4
End trial -- SD3 -- trial4
SD4
String start -- SD4 -- trial1
Touch knob B -- SD4 -- trial1
Touch knob B -- SD4 -- trial1
Touch knob B -- SD4 -- trial1
Open lid -- SD4 -- trial1
End state -- SD4 -- trial1
End trial -- SD4 -- trial1
No string start -- SD4 -- trial2
Touch knob B -- SD4 -- trial2
Touch knob A -- SD4 -- trial2
Remove string -- SD4 -- trial2
Remove string -- SD4 -- trial2
Touch knob B -- SD4 -- trial2
End trial -- SD4 -- trial2
No string start -- SD4 -- trial3
Open lid -- SD4 -- trial3
End state -- SD4 -- trial3
End trial -- SD4 -- trial3
String start -- SD4 -- trial4
Touch knob B -- SD4 -- trial4
Touch knob A -- SD4 -- trial4
Remove string -- SD4 -- trial4
Touch knob B -- SD4 -- trial4
End trial -- SD4 -- trial4

2 个答案:

答案 0 :(得分:3)

也许这样的事情对你有用。将"clipboard"部分替换为文件的实际名称(我假设它是纯文本文件)。

X <- readLines("clipboard")
out <- split(X, cumsum(grepl("SD[0-9]+", X)))
outL <- lapply(out, function(x) {
  data.frame(V1 = x[-1], V2 = x[1], 
             V3 = paste0("trial", cumsum(grepl("start", x))[-1]))
})

## Preview the first few lines of each to see 
##   if it's kind of what you are looking for
lapply(outL, head)
# $`1`
#                V1  V2     V3
# 1 No string start SD3 trial1
# 2        Open lid SD3 trial1
# 3       End state SD3 trial1
# 4       End trial SD3 trial1
# 5    String start SD3 trial2
# 6        Open lid SD3 trial2
# 
# $`2`
#             V1  V2     V3
# 1 String start SD4 trial1
# 2 Touch knob B SD4 trial1
# 3 Touch knob B SD4 trial1
# 4 Touch knob B SD4 trial1
# 5     Open lid SD4 trial1
# 6    End state SD4 trial1

基本思想是使用SD###模式作为&#34;分组&#34;各种标识符。我们找到那些grepl的人,然后让我们按照split将您的矢量分组为子矢量。 split创建list,因此我们可以使用lapply浏览每个列表项,并使用您正在寻找的列创建data.frame

答案 1 :(得分:0)

听起来像文本匹配问题比什么都重要。如果您的数据是字符串向量

vec <- c("SD3","No string start",...)

然后将其放入data.frame中开始:

behaviour <- data.frame(txt=vec)

然后,您需要以某种方式以编程方式识别样本ID - 如果它类似SD后跟数字:

ind <- grep("^SD[0-9]*$", behaviour$txt)
ntimes <- diff(c(ind, nrow(behaviour)+1))
behaviour$ID <- rep(behaviour$txt, times=ntimes)

找到每个SD的索引,然后重复足够的次数,使其到达下一个SD条目。

类似于细分,除此之外,您将从#34; End trial&#34;向后填充。条目

ind <- c(0,grep("End trial", beheaviour$txt))
ntimes <- diff(ind)
behaviour$trial <- sprintf("trial%d", rep(1:length(ntimes), times=ntimes))