考虑以下问题data.table
.第一个定义了一组具有每个组'x'的起始位置和结束位置的区域:
library(data.table)
d1 <- data.table(x = letters[1:5], start = c(1,5,19,30, 7), end = c(3,11,22,39,25))
setkey(d1, x, start)
# x start end
# 1: a 1 3
# 2: b 5 11
# 3: c 19 22
# 4: d 30 39
# 5: e 7 25
Run Code Online (Sandbox Code Playgroud)
第二个数据集具有相同的分组变量"x",并在每个组中定位"pos":
d2 <- data.table(x = letters[c(1,1,2,2,3:5)], pos = c(2,3,3,12,20,52,10))
setkey(d2, x, pos)
# x pos
# 1: a 2
# 2: a 3
# 3: b 3
# 4: b 12
# …
Run Code Online (Sandbox Code Playgroud) 我一直在努力解决这个问题已经有一段时间了,无法找到任何方法,所以如果你能提供帮助,我将非常感激!我是编程新手,我的代码可能效率低下,但这是我能想到的最好的.
基本上,我有2个.csv文件(fixes.csv和zones.csv),它们包含不同的变量并且具有不同数量的行和列.第一个文件fixes.csv包含实验期间记录的眼动数据,看起来像这样:
Order Participant Sentence Fixation StartPosition
1 1 1 1 -6.89
2 1 1 2 -5.88
3 1 1 3 -5.33
4 1 1 4 -4.09
5 1 1 5 -5.36
Run Code Online (Sandbox Code Playgroud)
这包含在句子阅读期间进行的眼动记录.会发生的是,20名参与者中的每一个都会读取一组40个12个单词的句子,对每个句子中的不同单词进行多次修改,有时会回过头来查看以前读过的单词.StartPosition列包含固定开始时屏幕上的位置(以视角度为单位).值通常在-8deg和8deg之间.
第二个文件zones.csv包含有关句子的信息.40个句子中的每一个包含12个单词,每个单词形成一个感兴趣的区域.zones.csv看起来像这样:
Sentence Zone ZoneStart ZoneEnd
1 1 -8.86 -7.49
1 2 -7.49 -5.89
1 3 -5.88 -4.51
1 4 -4.51 -2.90
Run Code Online (Sandbox Code Playgroud)
ZoneStart和ZoneEnd指示屏幕上每个区域的起始和结束坐标(以视角度为单位).因为每个句子中的单词不同,所以每个区域都有一个宽度.
我想要做的是同时使用两个文件,以便将zones.csv中的区域编号分配给fixes.csv中的注册.因此,例如,如果句子1中的第一个固定开始位置落在区域1的范围内,我希望将值1分配给它,以便结束文件看起来像这样:
Order Participant Sentence Fixation StartPosition Zone
1 1 1 1 -6.89 2
2 1 1 2 -5.88 2
3 1 1 3 -5.33 3 …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种简单的方法来按日期范围联接两个表。一个表包含确切的日期,另一个表包含两个标识时间段开始和结束的变量。如果第一个表中的日期与第二个表中的范围不符,则需要加入表。
data1 <- data.table(date = c('2010-01-21', '2010-01-25', '2010-02-02', '2010-02-09'),
name = c('id1','id2','id3','id4'))
data2 <- data.table(beginning=c('2010-01-15', '2010-01-23', '2010-01-30', '2010-02-05'),
ending = c('2010-01-22','2010-01-29','2010-02-04','2010-02-13'),
class = c(1,2,3,4))
result <- data.table(date = c('2010-01-21', '2010-01-25', '2010-02-02', '2010-02-09'),
beginning=c('2010-01-15', '2010-01-23', '2010-01-30', '2010-02-05'),
ending = c('2010-01-22','2010-01-29','2010-02-04','2010-02-13'),
name = c('id1','id2','id3','id4'),
class = c(1,2,3,4))
Run Code Online (Sandbox Code Playgroud)
有什么帮助吗?我发现了一些困难的例子,但由于格式的原因,它们甚至无法处理我的数据。我需要类似的东西:
select * from data1
left join
select * from data2
where data2.beginning <= data1.date <= data2.ending
Run Code Online (Sandbox Code Playgroud)
谢谢