Как усреднить строки на основе двух дублированных строк? - PullRequest
1 голос
/ 18 мая 2019

У меня 2000 строк с некоторыми дубликатами, я хотел бы усреднить строки на основе дубликатов.

Site  Location Line    Band1
Cal   BC04     BC04A   130
Cal   BC04     BC04B   131
Cal   BC04     BC04C   129

Я пытался:

 bind_cols(
    FC %>% distinct(site) %>% .[,-Band1],  # pull out columns we aren't      aggregating
  FC[,c(1, Band1)] %>% group_by(Band1) %>%
    summarise_each(funs(mean)) %>% .[,-1]  # aggregate other columns
)

Так что в идеале я хотел бы получить:

Site  Location Line    Band1
Cal   BC04     BC04A   130

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

С dplyr вы можете сделать:

df %>%
 group_by(Site) %>%
 filter(n() > 1) %>%
 mutate(Band1 = mean(Band1)) %>%
 slice(1) %>%
 ungroup()

  Site  Location Line  Band1
  <chr> <chr>    <chr> <dbl>
1 Cal   BC04     BC04A   130

Здесь хранятся дублированные значения «Site», вычисляется среднее значение «Band1» и выбирается первая строка для каждого «Site».

Может быть, вы также хотите связать дублированные и недублированные строки:

df %>%
 group_by(Site) %>%
 filter(n() > 1) %>%
 mutate(Band1 = mean(Band1)) %>%
 slice(1) %>%
 ungroup() %>%
 bind_rows(df %>%
            group_by(Site) %>%
            filter(n() < 1) %>%
            ungroup())

Или, если вы хотите рассчитать его только из дублированных значений для «Сайта»:

df %>%
 group_by(Site, dup = duplicated(Site)) %>%
 filter(dup) %>%
 mutate(Band1 = mean(Band1)) %>%
 slice(1) %>%
 ungroup() %>%
 select(-dup)

  Site  Location Line  Band1
  <chr> <chr>    <chr> <dbl>
1 Cal   BC04     BC04B   130
1 голос
/ 18 мая 2019

Мне нравится data.table для этого

x <-data.frame( 
Site = c( "Cal","Cal","Cal"),
Location = c( "BC04","BC04","BC04"),
Line = c( "BC04A","BC04B","BC04C"),
Band1= c(130,131, 129))

library( data.table)
x<- data.table( x )

x[ , .(Band1=mean( Band1 )) , by = c("Site","Location")]
...