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循环,但是数据很大,所以这将是一种有用的方法。
有人有什么想法吗?感谢。
答案 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个且唯一的解时,此解决方案才有效。