2016-08-03 15 views
0

我试图在数据集中使用变量的特定顺序 - 化合价和 - 实质上将行复制并粘贴到新数据集中。因此,对于每个子ID,对于每个化合价= 0,如果下一个化合价= -1,则将该行复制到称为“序列”的新数据集。问题在于试用订单是随机的,所以每个子标识的顺序是不同的(否则我至少可以根据试用编号写出一个大的块状脚本)。我最初没有提到的一件重要事情是:每个子标识的值都会有不同的数量,所以行数不是跨子标识的。重新组织数据以计算序列效应

正如数据看起来像一个例子:

SubID location valence reaction_time 
1  1  0  500 
1  1  -1  600 
1  0  1  400 
1  0  0  500 
2  1  1  700 
2  1  0  400 
2  0  -1  700 
2  0  0  400 

我在这种事情几乎是一个初学者(我猜它需要一个循环?)和唐” t有一个坚实的起点,所以任何帮助将非常感激。

谢谢!

回答

2

假设你的数据是d

out <- by(d, d$SubID, function(x) { 
    v <- x$valence 
    x[which(v[1:(length(v)-1)]==0 & v[2:(length(v))]==-1),] 
}) 
sequence <- do.call(rbind, out) 

结果:

> sequence 
    SubID location valence reaction_time 
1  1  1  0   500 
2  2  1  0   400 
+0

嗨,我想我看到(有点)脚本是如何工作的。但是我没有提到的一件事是每个子标识的行数是不同的。我怀疑这就是为什么我得到这个错误?:'tapply(seq_len(79155L),list('factor(data $ SubID)'= integer(0))中的错误,: 参数必须具有相同的长度' – Mik

+0

嗯, (我试着通过修改你的玩具数据集来试试)长度(factor(data $ SubID))== nrow(data)'?(另外,我编辑了答案,因为我刚刚意识到了因素...)'是无关的。) –

+0

'length(factor(data $ SubID))== nrow(data)'returns FALSE – Mik

1

我假设你想将你的data.frame分到第1和第6行。这里是data.table解决方案。

# load library and change to data.table 
library(data.table) 
setDT(df) 

# subset 
df[valence==0 & shift(valence == -1, type="lead"), .SD, by=SubID] 
    SubID location valence reaction_time 
1:  1  1  0   500 
2:  2  1  0   400 

数据

df <- read.table(header=T, text="SubID location valence reaction_time 
1  1  0  500 
1  1  -1  600 
1  0  1  400 
1  0  0  500 
2  1  1  700 
2  1  0  400 
2  0  -1  700 
2  0  0  400") 
+0

你好,非常感谢你为你的帮助 - 正如我在我上面的评论中提到的,我尝试了你的脚本,但是它返回了4个cols的空data.table(0行):subID,location,valence,RT'你有没有想过为什么会出现这种情况?谢谢! – Mik

+0

我尝试了一些潜在的错误来源:价格是性格或因素,这两个(令人惊讶的)工作没有问题。重命名变量导致错误。我现在唯一能想到的就是你的数据没有你正在寻找的模式。这些脚本适用于示例数据,对不对? – lmo

+0

得到它的工作!谢谢你,你的评论关于它没有我寻找的模式提示我(有80,000个观察结果可能性为0)......另外一个超级初学者的错误 - csv被格式化为价类(当然他们是阻止 - 通过审判重组固定它)。 – Mik