Первое вхождение в таблицу на основе значений другой таблицы в R - PullRequest
1 голос
/ 16 апреля 2019

Итак, у меня есть следующие таблицы:

Tab1:

Variable timestamp
s1       1053093896
s2       1053095216
s1       1053181616
s1       1053959216
s2       1054132016

и Tab2:

Variable timestamp
s1       1053129600
s2       1053820800

Я хочу извлечь первое вхождение для каждой переменной, гдеметки времени у tab1 выше, чем у tab2.Результат, который я ищу, выглядит следующим образом:

Variable timestamp
s1       1053181616
s2       1054132016

Ответы [ 4 ]

2 голосов
/ 16 апреля 2019

Это можно сделать, используя левое соединение, используя указанное логическое выражение:

library(sqldf)

sqldf("select b.Variable, min(a.timestamp) as timestamp 
  from tab2 b 
  left join tab1 a on a.Variable = b.Variable and a.timestamp > b.timestamp
  group by b.Variable")

, дающее:

  Variable  timestamp
1       s1 1053181616
2       s2 1054132016

Примечание

Lines1 <- "Variable timestamp
s1       1053093896
s2       1053095216
s1       1053181616
s1       1053959216
s2       1054132016"
tab1 <- read.table(text = Lines1, header = TRUE, strip.white = TRUE)

Lines2 <- "Variable timestamp
s1       1053129600
s2       1053820800"
tab2 <- read.table(text = Lines2, header = TRUE, strip.white = TRUE)
2 голосов
/ 16 апреля 2019

это способ использования пакета dplyr.Я изменил числа для лучшей читаемости.

df1 <- data.frame(variable = c("s1", "s2", "s1", "s1", "s2"),
           timestamp = 1:5, stringsAsFactors = F)

df2 <- data.frame(variable = c("s1", "s2"),
                  timestamp = c(2, 4), stringsAsFactors = F)
> df1
  variable timestamp
1       s1         1
2       s2         2
3       s1         3
4       s1         4
5       s2         5

> df2
  variable timestamp
1       s1         2
2       s2         4

 library(dplyr)
df1 %>% left_join(df2, by = "variable", suffix = c("", "_2")) %>% 
  filter(timestamp > timestamp_2) %>% 
  group_by(variable) %>% 
  slice(1) %>% 
  select(-timestamp_2)

# A tibble: 2 x 2
# Groups:   variable [2]
  variable timestamp
  <chr>        <int>
1 s1               3
2 s2               5
1 голос
/ 16 апреля 2019

Решение без объединения / слияния состоит в том, чтобы передать Variable и timestamp в Map фильтр tab1 на основе условия и выбрать первую строку и rbind список строк.

do.call(rbind, 
    Map(function(x, y) tab1[with(tab1, which.max(Variable == x & timestamp > y)), ],
                       tab2$Variable, tab2$timestamp))


#  Variable  timestamp
#3       s1 1053181616
#5       s2 1054132016
0 голосов
/ 16 апреля 2019

Вы можете сделать это в объединении data.table, упорядочив данные и используя опцию mult = 'first'

library(data.table)
# convert to data tables
setDT(tab1)
setDT(tab2)
# order data (unecessary if already ordered)
setorder(tab1, timestamp)
setorder(tab2, timestamp)

tab1[tab2, on = .(Variable, timestamp > timestamp), mult = 'first',
     .(Variable, x.timestamp)]

#    Variable x.timestamp
# 1:       s1  1053181616
# 2:       s2  1054132016

Используемые данные

tab1 <- fread('
Variable timestamp
s1       1053093896
s2       1053095216
s1       1053181616
s1       1053959216
s2       1054132016
')

tab2 <- fread('
Variable timestamp
s1       1053129600
s2       1053820800
')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...