Получение следующей записи между двумя фреймами данных в R - PullRequest
1 голос
/ 17 октября 2019

У меня есть два фрейма данных:

DataFrame 1:
ID
3000
4000
5000
6000

DataFrame2:
ID     Value
3000    1
3010    2
3020    3
4010    4
5000    5
6000    6 
7000    7

Мне нужно объединить оба фрейма с идентификатором, где Dataframe1.ID <(топ 1 в фрейме данных, но с шагом 1000). </p>

Результат будет

Dataframe1       Dataframe2.ID       value
3000               4010                4
4000               5000                5
5000               6000                6
6000               7000                7   

То, как я это сделал на сервере sql, соединяется с ID (который был разделен на 1000 и округлен до ближайшего числа), после чего я получил верхнюю 1наибольшее число из dataframe2. Я не уверен, как это сделать в R ..

, где dataframe1.ID/1000 <(выберите top 1 порядок dataframe2.ID/1000 по dataframe2.ID) Я не уверен, что естьлучший способ сделать это в R. </p>

1 Ответ

0 голосов
/ 17 октября 2019

Использование data.table

Код

df1[, DF2ID := lapply(ID, function(x){
  ind = nrow(df2) + 1 - sum(x + 1000 <= df2[, ID])
  return(df2[ind, ID])
})]

df1[, value := sapply(DF2ID, function(x){
  df2[which(ID == x), Value]
})]

Результат

> df1
     ID DF2ID value
1: 3000  4010     4
2: 4000  5000     5
3: 5000  6000     6
4: 6000  7000     7

Данные

df1 = data.table(ID = seq(3000, 6000, 1000))
df2 = data.table(ID = c(3000, 3010, 3020, 4010, 5000, 6000, 7000),
                 Value = seq(1:7))

Я предполагаю, что комментарий Джонни Фелпа относительно value является правильным. В противном случае это легко исправить во второй строке кода. Кроме того, безусловно, существует более элегантный способ простого извлечения ind из первого оператора lapply для получения value.

Edit: следующая процедура, возможно, более элегантна:

df1 = data.table(ID_df1 = seq(3000, 6000, 1000))
df2 = data.table(ID_df2 = c(3000, 3010, 3020, 4010, 5000, 6000, 7000),
                 Value = seq(1:7))


df1[, Value := sapply(ID_df1, function(x){
  nrow(df2) + 1 - sum(x + 1000 <= df2[, ID_df2])
})]

df_master = merge(df1, df2, by = 'Value')

> df_master
   Value ID_df1 ID_df2
1:     4   3000   4010
2:     5   4000   5000
3:     6   5000   6000
4:     7   6000   7000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...