Удаление повторяющихся значений строк и сохранение строк - PullRequest
3 голосов
/ 23 сентября 2019

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

Попытка с duplicated, distinct или unique не позволяет мне сохранить строки.

S.No   Rate   Proportion Control
C11    50     0.9         A
C11    50     0.9         B
C11    50     0.9         A
C21    40     0.8         B
C21    40     0.8         A
C21    40     0.8         A
S.No   Rate   Proportion Control
C11                       A
C11                       B
C11    50     0.9         A
C21                       B
C21                       A
C21    40     0.8         A

Ответы [ 3 ]

5 голосов
/ 23 сентября 2019

Try,

df[duplicated(df[1:3], fromLast = TRUE),2:3] <- ''

df
#  S.No Rate Proportion Control
#1  C11                       A
#2  C11                       B
#3  C11   50        0.9       A
#4  C21                       B
#5  C21                       A
#6  C21   40        0.8       A

Эквивалент в dplyr будет,

library(dplyr)

df %>% 
  mutate_at(vars(2:3), funs(replace(., duplicated(., fromLast = TRUE), '')))
2 голосов
/ 23 сентября 2019

Точно, не ясно об условиях, но вы можете попробовать

library(dplyr)

df %>%
  group_by(S.No) %>%
  mutate_at(2:3, ~replace(., row_number() != n(),''))
  #OR
  #mutate_at(vars(Rate,Proportion), ~replace(., row_number() != n(),''))

#  S.No  Rate  Proportion Control
# <chr> <chr> <chr>      <chr>  
#1 C11   ""    ""         A      
#2 C11   ""    ""         B      
#3 C11   50    0.9        A      
#4 C21   ""    ""         B      
#5 C21   ""    ""         A      
#6 C21   40    0.8        A  

Это заменит пустые значения для каждой записи в столбцах Rate и Proportion, за исключением последней строки в каждой группе (S.No).

данные

df <- structure(list(S.No = c("C11", "C11", "C11", "C21", "C21", "C21"
), Rate = c(50L, 50L, 50L, 40L, 40L, 40L), Proportion = c(0.9, 
0.9, 0.9, 0.8, 0.8, 0.8), Control = c("A", "B", "A", "B", "A", 
"A")), class = "data.frame", row.names = c(NA, -6L))
1 голос
/ 23 сентября 2019

Еще один способ сделать это в dplyr:

df %>% group_by(S.No) %>% mutate_at(2:3, .funs = funs( . = case_when(
  n() != row_number() ~  "",
  TRUE ~ as.character(.)
)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...