首页 文章

根据两个数据帧之间的条件将值分配给新列

提问于
浏览
1

我有两个数据帧 . 我需要将一列的值添加到另一个数据帧中的每一行,其中特定列的值满足第一个数据帧的条件 .

DF1:

a b   
x 23  
s 34 
v 15 
g 05 
k 69

DF2:

x y z
1 0 10
2 10 20
3 20 30
4 30 40
5 40 50
6 50 60
7 60 70

期望的输出:

a b n
x 23 3 
s 34 4
v 15 2
g 05 1
k 69 7

在我的数据集中,间隔很大,并且df1中的值不太可能恰好位于df2间隔的边界上 .

基本上对于 df1 中的每一行,我需要在 df2 中指定与其适合的范围相对应的数字 . 因此,如果 df1$b 介于 df2$ydf2$z 之间,则将输出$ n的值指定为 df2$x 的对应值 . 这是一个非常罗嗦的问题,所以请问我是否需要澄清 .

2 回答

  • 0
    df1 = read.table(text = "
    a b   
    x 23  
    s 34 
    v 15 
    g 05 
    k 69
    ", header=T, stringsAsFactors=F)
    
    df2 = read.table(text = "
    x y z
    1 0 10
    2 10 20
    3 20 30
    4 30 40
    5 40 50
    6 50 60
    7 60 70 
    ", header=T, stringsAsFactors=F)
    
    # function
    f = function(x) min(which(x >= df2$y & x <= df2$z))
    f = Vectorize(f)
    
    # apply function
    df1$n = f(df1$b)
    
    # check updated dataset
    df1
    
    #   a  b n
    # 1 x 23 3
    # 2 s 34 4
    # 3 v 15 2
    # 4 g  5 1
    # 5 k 69 7
    
  • 1

    你可以试试:

    library(tidyverse)
    df1 %>% 
      rowwise() %>% 
      mutate(n=df2[ b > df2$y & b <= df2$z,1]) %>% 
      ungroup()
    # A tibble: 5 x 3
          a     b     n
      <chr> <int> <int>
    1     x    23     3
    2     s    34     4
    3     v    15     2
    4     g     5     1
    5     k    69     7
    

    如已经评论过,您必须根据需要将 <> 更改为 <=>= .

相关问题