r - найти одинаковые элементы в списке на основе нескольких столбцов data.frame и удалить их - PullRequest
0 голосов
/ 14 декабря 2018

Предположим, у меня есть следующие data.frames, которые формируют мой список:

df_1 = data.frame(x = c(1,2,2,5,6), y = c(20,20,21,24,55), z = rnorm(5))
df_2 = data.frame(x = c(1,2,2,5,6), y = c(20,20,21,24,55), z = rnorm(5))

df_3 = data.frame(x = c(3,3,5,6), y = c(20,20,21,24), z = rnorm(4))
df_4 = data.frame(x = c(1,2,2), y = c(20,20,21), z = rnorm(3))
df_5 = data.frame(x = c(2,2,5,6), y = c(19,20,21,40), z = rnorm(4))

df_6 = data.frame(x = c(1,5,6), y = c(20,20,24), z = rnorm(3))
df_7 = data.frame(x = c(1,5,6), y = c(20,20,24), z = rnorm(3))
df_8 = data.frame(x = c(1,5,6), y = c(20,20,24), z = rnorm(3))

df_lst = list(df_1, df_2, df_3, df_4, df_5, df_6, df_7, df_8)

Как видите, df_1 и df_2 имеют идентичные столбцы x и y, и то же самое относитсяна df_6, df_7 и df_8.

Как удалить дубликаты data.frames на основе столбцов x и y?

Мне все равно, какиеdf удаляется, то есть это может быть df_1 ИЛИ df_2 и df_6 И df_7, ИЛИ df_6 И df_8, ИЛИ df_7 И df_8.

В моем реальном списке тысячи data.frames.

Есть предложения?

1 Ответ

0 голосов
/ 14 декабря 2018

Вот один из способов ...

df_lst[!duplicated(lapply(df_lst, function(df) df[,c("x","y")]))]

[[1]]
  x  y          z
1 1 20 -0.8043316
2 2 20 -1.0565257
3 2 21 -1.0353958
4 5 24 -1.1855604
5 6 55 -0.5004395

[[2]]
  x  y          z
1 3 20  0.3509210
2 3 20  0.8633185
3 5 21 -0.4789113
4 6 24 -1.1884792

[[3]]
  x  y           z
1 1 20 -0.26856637
2 2 20 -0.08022106
3 2 21 -0.12323569

[[4]]
  x  y           z
1 2 19 -0.09943981
2 2 20 -0.83475398
3 5 21  1.85777954
4 6 40 -0.49839702

[[5]]
  x  y          z
1 1 20 -1.2700546
2 5 20 -0.9369437
3 6 24  0.5334392

Сначала он формирует фиктивный список, включающий только столбцы x и y каждого фрейма данных, обрабатывает дубликаты, используя этот список, а затем удаляетсоответствующие элементы из исходного списка (сохраняя первое вхождение каждого).

...