我对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
答案 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))