Суммируйте определенные строки с учетом 2 ограничений в R - PullRequest
1 голос
/ 20 января 2020

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

Row <- c(1,2,3,4,5,6,7)
La <- c(51.25,51.25,51.75,53.25,53.25,54.25,54.25)
Lo <- c(128.25,127.75,127.25,119.75,119.25,118.75,118.25)
Y <- c(5,10,2,4,5,7,9)
Cl <- c("EF","EF","EF","EF","NA","NA","CE")     

d <- data.frame(Row,La,Lo,Y,Cl)

  Row    La     Lo  Y Cl
1   1 51.25 128.25  5 EF
2   2 51.25 127.75 10 EF
3   3 51.75 127.25  2 EF
4   4 53.25 119.75  4 EF
5   5 53.25 119.25  5 NA
6   6 54.25 118.75  7 NA
7   7 55.25 118.25  9 CE

Я хотел бы суммировать столбец «Y» (удаляя все значения из этой строки), если «Cl» равен NA с соответствующим « Значения Lo " и " La "близки (равны или меньше 1,00). По сути, я хочу удалить NA из фрейма данных, не теряя значение «Y», но вместо этого добавив это значение к ближайшему соседу.

Я бы хотел, чтобы возвращаемый фрейм данных выглядел так :

Row2 <- c(1,2,3,4,7)
La2 <- c(51.25,51.25,51.75,53.25,55.25)
Lo2 <- c(128.25,127.75,127.25,119.75,118.25)
Y2 <- c(5,10,2,9,16)
Cl2 <- c("EF","EF","EF","EF","CE")     

d2 <- data.frame(Row2,La2,Lo2,Y2,Cl2)

 Row2   La2    Lo2 Y2 Cl2
1    1 51.25 128.25  5  EF
2    2 51.25 127.75 10  EF
3    3 51.75 127.25  2  EF
4    4 53.25 119.75  9  EF
5    7 55.25 118.25 16  CE

недавнее редактирование: Если строка NA близка к одной строке с точки зрения значения Lo и такой же близости к другой строке в значении La, объедините значение La. Если есть 2 одинаково близких ряда значений Lo и La, объедините их с меньшим значением La.

Спасибо за помощь!

1 Ответ

3 голосов
/ 20 января 2020

Вот метод, который нужно использовать, если вы можете сделать некоторую матрицу расстояний m для расстояния между всеми строками (La, Lo) в ваших данных. Я использую вывод dist, который является евклидовым расстоянием. Выбирается строка с наименьшим расстоянием или самая ранняя такая строка, если наименьшее расстояние разделяется> 1 строкой.

w <- which(is.na(d$Cl))
m <- as.matrix(dist(d[c('La', 'Lo')]))
m[row(m) %in% w] <- NA
d$g <- replace(seq(nrow(d)), w, apply(m[,w], 2, which.min))

library(dplyr)

d %>% 
  group_by(g) %>% 
  summarise(La = La[!is.na(Cl)],
            Lo = Lo[!is.na(Cl)],
            Y = sum(Y), 
            Cl = Cl[!is.na(Cl)]) %>% 
  select(-g)

# # A tibble: 5 x 4
#      La    Lo     Y Cl   
#   <dbl> <dbl> <dbl> <fct>
# 1  51.2  128.     5 EF   
# 2  51.2  128.    10 EF   
# 3  51.8  127.     2 EF   
# 4  53.2  120.     9 EF   
# 5  54.2  118.    16 CE   
...