подготовка наборов данных R для публикации - удаление повторяющихся элементов - PullRequest
1 голос
/ 03 февраля 2020

Я сохранил результаты анализа данных в фрейме данных (или в таблице), и я хотел бы подготовить его к публикации (отправить в латекс), удалив повторяющиеся элементы из фрейма данных. Есть ли функция R, которая выполняет эту работу автоматически? Текущий пример - my_cars, и я хочу превратить его в my_cars_publication.

library(dplyr)

my_cars <- 
mtcars %>% 
  mutate(car_name=rownames(.))   %>% 
  select(car_name, everything()) %>% 
  separate(car_name, c("car_name1", "car_name2"),sep=" " )

my_cars 

my_cars_publication <- my_cars
car_name1_index <- c(2,5, 9:14, 21 )
car_name2_index <- c(2)


my_cars_publication[car_name1_index,"car_name1"] <- NA
my_cars_publication[car_name2_index,"car_name2"] <- NA


my_cars_publication

enter image description here

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Это можно сделать для каждого столбца, используя dplyr::if_else, base ifelse или base replace.

mtcars %>% 
  mutate(car_name=rownames(.))   %>% 
  select(car_name, everything()) %>% 
  separate(car_name, c("car_name1", "car_name2"),sep=" " ) %>% 
  mutate_at(vars(car_name1, car_name2),
            ~ replace(., c(FALSE, .[-1] == head(., n = -1)), NA))
#           ~ if_else(c(FALSE, .[-1] == head(., n=-1)), .[NA], .))
#           ~ ifelse(c(FALSE, .[-1] == head(., n=-1)), .[NA], .))

# Warning: Expected 2 pieces. Additional pieces discarded in 3 rows [2, 4, 29].
# Warning: Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [6].
#    car_name1   car_name2  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# 1      Mazda         RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# 2       <NA>        <NA> 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# 3     Datsun         710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# 4     Hornet           4 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# 5       <NA>  Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# 6    Valiant        <NA> 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# 7     Duster         360 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
# 8       Merc        240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
# 9       <NA>         230 22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
# 10      <NA>         280 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
# 11      <NA>        280C 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
# 12      <NA>       450SE 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
# 13      <NA>       450SL 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
# 14      <NA>      450SLC 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
# 15  Cadillac   Fleetwood 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
# 16   Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
# 17  Chrysler    Imperial 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
# 18      Fiat         128 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
# 19     Honda       Civic 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
# 20    Toyota     Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
# 21      <NA>      Corona 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
# 22     Dodge  Challenger 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
# 23       AMC     Javelin 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
# 24    Camaro         Z28 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
# 25   Pontiac    Firebird 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
# 26      Fiat        X1-9 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
# 27   Porsche       914-2 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
# 28     Lotus      Europa 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
# 29      Ford     Pantera 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
# 30   Ferrari        Dino 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
# 31  Maserati        Bora 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
# 32     Volvo        142E 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

(Причина, по которой я выбрал .[NA] в некоторых вариантах, заключается в том, что if_else заставляет оба «истинных» и «ложных» вектора иметь одинаковый класс; NA сам по себе технически logical, что не соответствует ни character, ни numeric. Я мог бы Я жестко закодировал NA_character_, но я подумал, что более общий подход, который соответствует правильному варианту, основанному на исходном столбце. Знаете ли вы, что есть по крайней мере шесть вариантов NA? Попробуйте lapply(list(T, 1L, 1, "1", Sys.time(), Sys.Date()), function(z) class(z[NA])), чтобы показать шесть, и сравните их, чтобы определить, что они не identical.)

1 голос
/ 03 февраля 2020

Мы можем использовать mutate_at для выбранных столбцов и replace их с NA, если они duplicated.

library(dplyr)
cols <- c("car_name1", "car_name2")

my_cars %>% mutate_at(vars(cols), ~replace(., duplicated(.), NA))

#   car_name1   car_name2  mpg cyl  disp  hp drat   wt qsec vs am gear carb
#1      Mazda         RX4 21.0   6 160.0 110 3.90 2.62 16.5  0  1    4    4
#2       <NA>        <NA> 21.0   6 160.0 110 3.90 2.88 17.0  0  1    4    4
#3     Datsun         710 22.8   4 108.0  93 3.85 2.32 18.6  1  1    4    1
#4     Hornet           4 21.4   6 258.0 110 3.08 3.21 19.4  1  0    3    1
#5       <NA>  Sportabout 18.7   8 360.0 175 3.15 3.44 17.0  0  0    3    2
#6    Valiant        <NA> 18.1   6 225.0 105 2.76 3.46 20.2  1  0    3    1
#7     Duster         360 14.3   8 360.0 245 3.21 3.57 15.8  0  0    3    4
#8       Merc        240D 24.4   4 146.7  62 3.69 3.19 20.0  1  0    4    2
#9       <NA>         230 22.8   4 140.8  95 3.92 3.15 22.9  1  0    4    2
#10      <NA>         280 19.2   6 167.6 123 3.92 3.44 18.3  1  0    4    4
#11      <NA>        280C 17.8   6 167.6 123 3.92 3.44 18.9  1  0    4    4
#...
#...

, который можно сделать в базе R как

mycars[cols] <- lapply(my_cars[cols], function(x) replace(x, duplicated(x), NA))
...