Как выбрать данные из столбца и создать новый столбец в R - PullRequest
0 голосов
/ 04 марта 2020

Я хочу создать новый столбец для отображения данных периода с использованием идентификаторов.

Мои данные похожи на эти данные

df1<-read.table(text="ID Location Day Period Group
241	A	am	M1	A
231	D	am	N1	A
241	N	pm	M2	A
234	K	pm	N2	B
231	G	pm	N2	B
300	K	am	M2	A",header=TRUE)

и ожидаемые данные:

df1<-read.table(text="ID Location Day Period Group Match
241	A	am	M1	A	M2
231	D	am	N1	A	N2
234	K	pm	N2	B	NA
300	K	am	M2	A	NA",header=TRUE)

При наличии дублированных идентификаторов сохраняется только один идентификатор, а значение периода указывается в столбце «Соответствие». Я хочу иметь бланк вместо NA

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Попробуйте это

library(dplyr)

df1 %>% 
  filter(!duplicated(ID)) %>% 
  left_join(
    df1 %>% 
      filter(duplicated(ID)) %>% 
      select(ID, Period), by = "ID") %>% 
  rename(Period = Period.x, Match = Period.y)

или используя group_split

library(dplyr)
library(purrr)

df1 %>% 
  mutate(is_duplicated = duplicated(ID)) %>% 
  group_split(is_duplicated, keep = FALSE) %>% 
  reduce(left_join, by = "ID", suffix = c("", "_match")) %>% 
  select(names(df1), Match = Period_match) 
0 голосов
/ 04 марта 2020

После группировки по 'ID' мы можем получить элемент first для 'Group', 'Day', 'Location' и вернуть второй элемент 'Match'

library(dplyr)
df1 %>%
   group_by(ID) %>% 
   summarise(Group = first(Group), Day = first(Day),
             Location = first(Location),
             Match = Period[2], Period = first(Period))
# A tibble: 4 x 6
#     ID Group Day   Location Match Period
#  <int> <fct> <fct> <fct>    <fct> <fct> 
#1   231 A     am    D        N2    N1    
#2   234 B     pm    K        <NA>  N2    
#3   241 A     am    A        M2    M1    
#4   300 A     am    K        <NA>  M2    

Или другой вариант - mutate столбцы со значением first после группировки по идентификатору, а затем выполнить summarise

df1 %>%
    group_by(ID) %>% 
    mutate_at(vars(Group, Day, Location), first) %>%
    group_by(Group,  Day, Location , .add= TRUE) %>%
    summarise(Match = Period[2],   Period = first(Period))
# A tibble: 4 x 6
# Groups:   ID, Group, Day [4]
#     ID Group Day   Location Match Period
#  <int> <fct> <fct> <fct>    <fct> <fct> 
#1   231 A     am    D        N2    N1    
#2   234 B     pm    K        <NA>  N2    
#3   241 A     am    A        M2    M1    
#4   300 A     am    K        <NA>  M2    

В версии devel dplyr, это можно сделать более компактным с помощью across

df1 %>% 
   group_by(ID) %>% 
   summarise(across(c(Group, Day, Location), first),
              Match = Period[2], Period = first(Period))
# A tibble: 4 x 6
#     ID Group Day   Location Match Period
#  <int> <fct> <fct> <fct>    <fct> <fct> 
#1   231 A     am    D        N2    N1    
#2   234 B     pm    K        <NA>  N2    
#3   241 A     am    A        M2    M1    
#4   300 A     am    K        <NA>  M2    

Здесь мы предполагаем, что на уникальный идентификатор будет не более 2 строк

...