将矢量值插入最近值的数据框中

时间:2016-09-08 17:35:38

标签: r dataframe

a <- c(1,45,90,115,170,203,259)
b <- c(35,60,110,145,190,231,270)
df <- data.frame(a,b)

c <- c(27,175, 230)

我想将c的值插入df,值的行位置应取决于它们在列a和{{1}的值之间的位置}。例如。 b(175)应与a = 170&amp;同一行出现在同一行b = 190,230应与a = 203 b = 270等同一行。

c[2]包含的值少于c - 所以单元格可以df

我无法在任何地方找到答案。我发现的最好的是数据表中的NA功能,但这不允许“不会更大”。条件。

我可以使用for循环,但是数据很大,所以这将是一种有用的方法。

有人有什么想法吗?感谢。

3 个答案:

答案 0 :(得分:3)

使用findInterval()识别有效索引

aidx = findInterval(c, df$a)
bidx = findInterval(c, df$b) + 1
keep = aidx == bidx

然后更新原始数据框

df[aidx[keep], "c"] = c[keep]

如果data.frame行已经排序,我希望这可以快速达到数百万行的行。

答案 1 :(得分:1)

如果您想要快速,可以尝试non-equi版本data.table的{​​{1}}加入功能:

1.9.7

如果您没有library(data.table) v <- c(27, 175, 230) v_dt <- data.table(id = v, c = v) # create a data table with an identical column to # join with df v_dt[setDT(df), .(a, b, c), on = .(id > a, id < b), allow = T] # a b c #1: 1 35 27 #2: 45 60 NA #3: 90 110 NA #4: 115 145 NA #5: 170 190 175 #6: 203 231 230 #7: 259 270 NA data.table,则可以使用1.9.7。默认foverlaps参数为type,这意味着只要any [id, c]中的值与来自v_dt的范围[a, b]有任何重叠,它们将匹配,因为每行df,这相当于id == c落在范围内:

id

答案 2 :(得分:0)

这是使用基础R的解决方案。

#sample data
a <- c(1,45,90,115,170,203,259)
b <- c(35,60,110,145,190,231,270)
df <- data.frame(a,b)
c <- c(27,175, 230)

#Solution
#create place holder column
df$c<-NA
#find rows where the elements of c will fit
location<-which(c > df$a & c<df$b)
#update dataframe
df$c[location]<-c

哪个命令会抛出一堆警告,但这无关紧要。只有当向量c中的每个元素都有1个且唯一的解时,此解决方案才有效。