зацикливание строк и изменение отсутствующих значений в R - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть этот фрейм данных:

a=as.data.frame(tribble(  
  ~cod, ~text, ~x2007, ~x2008,  
  "a","aa",0,0,  
   0,"--",12,13,  
  "b","bb",1,2,  
  "c","cc", 0, 0,  
  0,"dd", 0,0,  
  0,"ee",7,8))

и мне нужно объединить несколько строк (1 с 2, 4 с 5 и 5). Результат должен быть:

  cod text x2007 x2008  
1 a   aa --      12    13  
3 b   bb          1     2  
4 c   cc dd ee    5     6 

Я попробовал:

b=vector()  
for (i in 2:nrow(a)) {  
  if(a[i,1]==0) {  
    a[i-1,2]=paste(a[i-1,2],a[i,2])  
    a[i-1,3:4]=a[i,3:4]  
    b=c(b,i)  
    }  
}  
a=a[-b,]  #drop merged lines

но работает только с двумя последовательными строками

  cod text x2007 x2008
1 a   aa --   12    13
3 b   bb       1     2
4 c   cc dd    5     6

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Вот еще один вариант. Заполняем «треска» вниз, затем группируем по треске и суммируем данные.

library(tidyverse)

a %>% 
  mutate(cod = ifelse(cod == 0, NA, cod)) %>%
  fill(cod) %>%
  group_by(cod) %>%
  summarise(text = paste(text, collapse = " "), x2007 = sum(x2007), x2008 = sum(x2008))

#> # A tibble: 3 x 4
#>   cod   text     x2007 x2008
#>   <chr> <chr>    <dbl> <dbl>
#> 1 a     aa --       12    13
#> 2 b     bb           1     2
#> 3 c     cc dd ee     7     8
0 голосов
/ 02 сентября 2018

Вам нужен двухэтапный процесс.

Шаг 1: замените 0 в cod на правильное значение, заполнив столбец. В пакете zoo есть хорошая функция, которая будет делать это, но для ее использования нам нужно сначала заменить 0 на NA в cod.

a[a$cod == 0, "cod"] <- NA
a$cod <- zoo::na.locf(a$cod)

Шаг 2: объедините значения в x2007 и x2008 для строк, имеющих одинаковое значение для cod. Я не знаю, как вы хотите их объединить, но я буду использовать sum в моем примере кода.

result <- aggregate(a[ , c("x2007", "x2008")], by=a["cod"], FUN=sum)

Тогда мы можем напечатать результат

> result
  cod x2007 x2008
1   a    12    13
2   b     1     2
3   c     7     8
...