Удалить повторяющиеся элементы в строке из фрейма данных в R - PullRequest
3 голосов
/ 06 апреля 2020

Удаление строк в относительно относительно просто . Однако удаление повторяющихся элементов строки во фрейме данных является более сложной проблемой.

Давайте начнем с этого df:

df <- structure(list(V1 = c("B1182", "B1182", "B1182", "B1182", "B1182", 
"B1182", "B1182", "B1182", NA, NA, "B1182", "B1182", "B1182", 
NA, NA, NA, NA, "P2000", "P2000", NA), V2 = c("B124D", "B124D", 
"B124D", "B124D", "B124D", "B124D", "B124D", "B124D", NA, NA, 
"B124D", "B124D", "B124D", NA, NA, NA, NA, "P2000", "P2000", 
NA), V3 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, "U3003", "U3003", NA), V4 = c(NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "P2000", 
"P2000", NA), V5 = c(NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_), V6 = c(NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_), V7 = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_), 
    V8 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    )), .Names = c("V1", "V2", "V3", "V4", "V5", "V6", "V7", 
"V8"), row.names = c(NA, 20L), class = "data.frame")

Это вывод df:

      V1    V2    V3    V4   V5   V6   V7   V8
1  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
2  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
3  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
4  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
5  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
6  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
7  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
8  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
9   <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
10  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
11 B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
12 B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
13 B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
14  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
15  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
16  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
17  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
18 P2000 P2000 U3003 P2000 <NA> <NA> <NA> <NA>
19 P2000 P2000 U3003 P2000 <NA> <NA> <NA> <NA>
20  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>

Как видите, строки 18 и 19 содержат повторяющиеся коды (P2000). Я хотел бы удалить эти дубликаты элементов и оставить только первое, что появляется в строке. Обратите внимание, что это отрывок моего оригинального df, поэтому он должен быть применим ко всем ситуациям.

Ожидаемый результат может выглядеть следующим образом:

      V1    V2    V3    V4   V5   V6   V7   V8
1  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
2  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
3  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
4  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
5  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
6  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
7  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
8  B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
9   <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
10  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
11 B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
12 B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
13 B1182 B124D  <NA>  <NA> <NA> <NA> <NA> <NA>
14  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
15  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
16  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
17  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>
18 P2000  <NA> U3003  <NA> <NA> <NA> <NA> <NA>
19 P2000  <NA> U3003  <NA> <NA> <NA> <NA> <NA>
20  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>

Меня не волнуют сами переменные, так как они будут переставлены и преобразованы позже .

Итак, как удалить дублирующиеся элементы в строке в этом df? Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

Вы можете использовать tapply в строках и заменять дубликаты на NA:

df[t(apply(df,  1, duplicated))] <- NA

> df
      V1    V2    V3   V4   V5   V6   V7   V8
1  B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
2  B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
3  B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
4  B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
5  B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
6  B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
7  B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
8  B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
9   <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA>
10  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA>
11 B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
12 B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
13 B1182 B124D  <NA> <NA> <NA> <NA> <NA> <NA>
14  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA>
15  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA>
16  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA>
17  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA>
18 P2000  <NA> U3003 <NA> <NA> <NA> <NA> <NA>
19 P2000  <NA> U3003 <NA> <NA> <NA> <NA> <NA>
20  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA>
1 голос
/ 06 апреля 2020

Опция с tidyverse с использованием pmap

library(purrr)
library(dplyr)
df %>% 
    pmap_dfr(., ~ {x1 <- c(...); replace(x1, duplicated(x1), NA)})
# A tibble: 20 x 8
#   V1    V2    V3    V4    V5    V6    V7    V8   
# * <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
# 1 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
# 2 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
# 3 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
# 4 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
# 5 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
# 6 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
# 7 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
# 8 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
# 9 <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
#10 <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
#11 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
#12 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
#13 B1182 B124D <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
#14 <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
#15 <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
#16 <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
#17 <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
#18 P2000 <NA>  U3003 <NA>  <NA>  <NA>  <NA>  <NA> 
#19 P2000 <NA>  U3003 <NA>  <NA>  <NA>  <NA>  <NA> 
#20 <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
1 голос
/ 06 апреля 2020

Это выглядело так, как будто ваш второй вопрос включал tidyverse, поэтому здесь есть альтернатива, в которой используются pivot_longer и pivot_wider:

library(tidyverse)

df %>%
  mutate(rn = row_number()) %>%
  pivot_longer(cols = -rn, names_to = "var", values_to = "value") %>%
  group_by(rn) %>%
  mutate(value = ifelse(duplicated(value), NA, value)) %>%
  pivot_wider(id_cols = rn, names_from = "var", values_from = "value")

Вывод

# A tibble: 20 x 9
# Groups:   rn [20]
      rn V1    V2    V3    V4    V5    V6    V7    V8   
   <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
 1     1 B1182 B124D NA    NA    NA    NA    NA    NA   
 2     2 B1182 B124D NA    NA    NA    NA    NA    NA   
 3     3 B1182 B124D NA    NA    NA    NA    NA    NA   
 4     4 B1182 B124D NA    NA    NA    NA    NA    NA   
 5     5 B1182 B124D NA    NA    NA    NA    NA    NA   
 6     6 B1182 B124D NA    NA    NA    NA    NA    NA   
 7     7 B1182 B124D NA    NA    NA    NA    NA    NA   
 8     8 B1182 B124D NA    NA    NA    NA    NA    NA   
 9     9 NA    NA    NA    NA    NA    NA    NA    NA   
10    10 NA    NA    NA    NA    NA    NA    NA    NA   
11    11 B1182 B124D NA    NA    NA    NA    NA    NA   
12    12 B1182 B124D NA    NA    NA    NA    NA    NA   
13    13 B1182 B124D NA    NA    NA    NA    NA    NA   
14    14 NA    NA    NA    NA    NA    NA    NA    NA   
15    15 NA    NA    NA    NA    NA    NA    NA    NA   
16    16 NA    NA    NA    NA    NA    NA    NA    NA   
17    17 NA    NA    NA    NA    NA    NA    NA    NA   
18    18 P2000 NA    U3003 NA    NA    NA    NA    NA   
19    19 P2000 NA    U3003 NA    NA    NA    NA    NA   
20    20 NA    NA    NA    NA    NA    NA    NA    NA 
...