R:查找多个条件的数据帧索引
R: find data frame index of multiple conditions
给定两个数据框 s
和 q
,每个数据框有五个观察值:
set.seed(8)
s <- data.frame(id=sample(c('Z','X'), 5, T),
t0=sample(1:10, 5, T),
t1 = sample(11:30, 5, T))
q <- data.frame(id=sample(c('Z','X'), 5, T),
t0=sample(1:10, 5, T),
t1 = sample(11:30, 5, T))
> s
id t0 t1
1 Z 8 20
2 Z 3 12
3 X 10 19
4 X 8 21
5 Z 7 13
> q
id t0 t1
1 X 3 30
2 Z 5 12
3 Z 7 23
4 Z 3 21
5 X 7 27
变量 t0 和 t1 之间观察值的中点是(例如,对于 s
数据):
s$t0+(s$t1-s$t0)/2
要找到 s
中(第一个)观测值的索引,其中点最接近于 q
中的第一个观测值,我可以这样做:
i <- which.min(abs((s$t0+(s$t1-s$t0)/2 - (q$t0[1]+(q$t1[1]-q$t0[1])/2)))
s[i,]
给出:
id t0 t1
3 X 10 19
但是如果我还想以 id 变量为条件(例如伪代码,如:which.min(....) & s$id == q$id[1]
- 在这种情况下,我不知道如何在原始数据中找到相同的索引 s
在 ids 中寻找中点 'X')。这个 SO 很接近,但不准确。
再次:我需要一个索引,用于原始5行数据集。
当您的条件未得到遵守时,将 which.min
参数设置为无穷大:
val <- abs((s$t0+(s$t1-s$t0)/2 - (q$t0[1]+(q$t1[1]-q$t0[1])/2))
val[s$id != q$id[1]] <- Inf
i <- which.min(val)
顺便说一句,您可以将第一个字符的表达式简化为:
val <- abs((s$t0+s$t1)/2-(q$t0[1]+q$t1[1])/2)
甚至
val <- abs(s$t0+s$t1-q$t0[1]-q$t1[1])/2
给定两个数据框 s
和 q
,每个数据框有五个观察值:
set.seed(8)
s <- data.frame(id=sample(c('Z','X'), 5, T),
t0=sample(1:10, 5, T),
t1 = sample(11:30, 5, T))
q <- data.frame(id=sample(c('Z','X'), 5, T),
t0=sample(1:10, 5, T),
t1 = sample(11:30, 5, T))
> s
id t0 t1
1 Z 8 20
2 Z 3 12
3 X 10 19
4 X 8 21
5 Z 7 13
> q
id t0 t1
1 X 3 30
2 Z 5 12
3 Z 7 23
4 Z 3 21
5 X 7 27
变量 t0 和 t1 之间观察值的中点是(例如,对于 s
数据):
s$t0+(s$t1-s$t0)/2
要找到 s
中(第一个)观测值的索引,其中点最接近于 q
中的第一个观测值,我可以这样做:
i <- which.min(abs((s$t0+(s$t1-s$t0)/2 - (q$t0[1]+(q$t1[1]-q$t0[1])/2)))
s[i,]
给出:
id t0 t1
3 X 10 19
但是如果我还想以 id 变量为条件(例如伪代码,如:which.min(....) & s$id == q$id[1]
- 在这种情况下,我不知道如何在原始数据中找到相同的索引 s
在 ids 中寻找中点 'X')。这个 SO 很接近,但不准确。
再次:我需要一个索引,用于原始5行数据集。
当您的条件未得到遵守时,将 which.min
参数设置为无穷大:
val <- abs((s$t0+(s$t1-s$t0)/2 - (q$t0[1]+(q$t1[1]-q$t0[1])/2))
val[s$id != q$id[1]] <- Inf
i <- which.min(val)
顺便说一句,您可以将第一个字符的表达式简化为:
val <- abs((s$t0+s$t1)/2-(q$t0[1]+q$t1[1])/2)
甚至
val <- abs(s$t0+s$t1-q$t0[1]-q$t1[1])/2