遍历行并更改R中的缺失值

时间:2018-09-01 23:41:42

标签: r dataframe concatenation rows

我有这个数据框:

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 :(得分:1)

您需要分两步进行。

步骤1:通过填写该列,以正确的值替换cod中的0。 zoo软件包具有一个很好的功能,可以执行此操作,但是要使用它,我们首先需要用cod中的NA替换0。

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

步骤2:将x2007x2008中具有相同值的行的值组合在一起。我不知道您想如何将它们结合起来,但是我将在示例代码中使用cod

sum

然后我们可以打印结果

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

答案 1 :(得分:1)

这是另一种选择。我们向下填写“鳕鱼”,然后按鳕鱼分组并汇总数据。

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