2017-04-09 2 views
0

finden habe ich einen Datenrahmen x:R Werte von Intervallen

begin end 
1  1 3 
2  5 6 
3 11 18 

und einen Vektor v <- c(1,2,5,9,10,11,17,20) Ich mag würde alle Werte von Vektor finden, die Elemente von einem Intervall von Datenrahmen sind. Also würde ich gerne einen Vektor c(1,2,5,11,17) bekommen. Wie ist es möglich?

+0

Sind Ihre Intervalle nicht überlappend? Siehe '? FindInterval' -' v [findInterval (v, x $ begin) == (findInterval (v, x $ end) + 1L)] ' –

Antwort

1

Wir können Map verwenden, um die Sequenz zu erhalten zwischen entsprechenden, begin/end Werte in einem list, unlist die list und verwenden intersect die Elemente zu erhalten, gemeinsam sowohl in der vector s

intersect(unlist(Map(`:`, x$begin, x$end)), v) 
#[1] 1 2 5 11 17 
2

für zeilenweise Werte zu erhalten verwenden, apply auf MARGIN1 mit intersect

apply(df, 1, function(a) intersect(v, a[1]:a[2])) 
#[[1]] 
#[1] 1 2 

#[[2]] 
#[1] 5 

#[[3]] 
#[1] 11 17 

ODER unlist um einen Vektor zu erhalten

unlist(apply(df, 1, function(a) intersect(v, a[1]:a[2]))) 
#OR 
intersect(v, unlist(apply(df, 1, function(a) a[1]:a[2]))) #as commented by akrun 
#[1] 1 2 5 11 17 
+1

Ich denke, du kannst' intersect' einmal nach 'unlist' aufrufen ' – akrun

Verwandte Themen