Как установить подкадр данных на основе столбцов из другого кадра данных? - PullRequest
0 голосов
/ 26 мая 2018

У меня есть два фрейма данных (df1 и df2), и я хочу установить поднабор df2 на основе первых двух столбцов, содержащихся в df1.Например,

df1 = data.frame(x=c(1,1,1,1,1),y=c(1,2,3,4,5),value=c(3,4,5,6,7))
df2 = data.frame(x=c(1,1,1,1,1,2), y=c(5,3,4,2,1,6), value=c(8,9,10,11,12,13))

enter image description here

Как мы видим, строка 6 (2,6) в df2 не включена в df1, поэтомуЯ просто выберу строку от 1 до 5 в df2.

Кроме того, я хочу изменить df2 на основе df1.Окончательный результат должен выглядеть следующим образом:

enter image description here

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

При использовании объединения по умолчанию кадры данных объединяются общими переменными, и результаты сортируются.Таким образом, вы можете сделать:

merge(df2, df1[c('x', 'y')])

#   x y value
# 1 1 1    12
# 2 1 2    11
# 3 1 3     9
# 4 1 4    10
# 5 1 5     8

Для сортировки по порядку df1 используйте метод @ Mankind_008

merge(df1[c('x','y')], df2 , sort = F)

Пример:

set.seed(0)
df1 <- df1[sample(seq_len(nrow(df1))),]
df2 <- df2[sample(seq_len(nrow(df2))),]
df1
#   x y value
# 5 1 5     7
# 2 1 2     4
# 4 1 4     6
# 3 1 3     5
# 1 1 1     3    
merge(df1[c('x','y')], df2 , sort = F)
#   x y value
# 1 1 5     8
# 2 1 2    11
# 3 1 4    10
# 4 1 3     9
# 5 1 1    12
0 голосов
/ 26 мая 2018

Используйте таблицы данных:

library(data.table)

Создайте свои данные в виде data.table:

df1 <- data.table( x = c(1,1,1,1,1), y = c(1,2,3,4,5), value = c(3,4,5,6,7) )
df2 <- data.table( x = c(1,1,1,1,1,2), y = c(5,3,4,2,1,6), value = c(8,9,10,11,12,13) )

Или преобразуйте существующие фреймы данных:

df1 <- as.data.table( df1 )
df2 <- as.data.table( df2 )

Тогда:

df2[ df1, on = .(x,y) ]

Любой столбец в df1 с таким же именем в df2 будет переименован в i.columnname:

   x y value i.value
1: 1 1    12       3
2: 1 2    11       4
3: 1 3     9       5
4: 1 4    10       6
5: 1 5     8       7

Обратите внимание, что он уже упорядочен по x и y.Если вы хотите упорядочить по столбцу «значение» (или любому другому):

df2[ df1, on = .(x,y) ][ order(value) ]

Преимущество использования data.table (или dplyr, как решения, предложенного AntoniosK), заключается в том, что вы можете сохранитьдва набора данных разделены.

...