我有这个数据框:
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
有什么想法吗?
答案 0 :(得分:1)
您需要分两步进行。
步骤1:通过填写该列,以正确的值替换cod
中的0。 zoo
软件包具有一个很好的功能,可以执行此操作,但是要使用它,我们首先需要用cod
中的NA替换0。
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)
答案 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