按组递增

6
我正在尝试每个组递增一个列。因此,如果有一个值,我们就根据它之前的值递增它,否则我们将其保留不变。
例如,它将从df变为dfb。
df <- data.frame(group = c("A", "A", "B", "B", "B", "C", "C", "C", "D", "D"), 
                 num = c(1, NA, NA, 8, NA, 5, NA, NA, 10, NA))
dfb <- data.frame(group = c("A", "A", "B", "B", "B", "C", "C", "C", "D", "D"),
                 num = c(1, 2, NA, 8, 9, 5, 6, 7, 10, 11))
> df

   group num
1      A   1
2      A  NA
3      B  NA
4      B   8
5      B  NA
6      C   5
7      C  NA
8      C  NA
9      D  10
10     D  NA

> dfb
   group num
1      A   1
2      A   2
3      B  NA
4      B   8
5      B   9
6      C   5
7      C   6
8      C   7
9      D  10
10     D  11

我尽力了,但还是没成功。

dfc <- df %>%
   mutate(num = ifelse(is.na(num),lag(num) + 1, num))

由于我之前的问题描述不清楚,所以删除了之前的问题。 感谢您的帮助!


不清楚您为什么删除了先前的问题,因为我在被删除的问题中的解决方案同样适用于新的例子。 - akrun
2个回答

6
我们可以做到。
df %>% 
 group_by(grp1= cumsum(!is.na(num)), group) %>%
 mutate(num = if(n() > 1) num[1L] + row_number()-1 else num) %>% 
 ungroup() %>%
 select(-grp1)
# A tibble: 10 × 2
#    group   num
#   <fctr> <dbl>
#1       A     1
#2       A     2
#3       B    NA
#4       B     8
#5       B     9
#6       C     5
#7       C     6
#8       C     7
#9       D    10
#10      D    11

或者使用 data.table

library(data.table)
setDT(df)[, num := if(.N >1) num[1L] + seq_len(.N)-1
            else num,.(grp1=cumsum(!is.na(num)), group)]

0
你所需要的只是一个基本的for循环 :) 干杯!
df <- data.frame(group = c("A", "A", "B", "B", "B", "C", "C", "C", "D", "D"), 
                 num = c(1, NA, NA, 8, NA, 5, NA, NA, 10, NA))
df.new <- df

for(i in 2:dim(df.new)[1]){

  if(!is.na(df[i - 1, 'num'])){

    df.new[i, 'num'] <- df[i - 1, "num"] + 1

  }

1
可以用循环来完成,但一般来说循环较慢,更重要的是这个计算是更大管道的一部分。谢谢你的帮助! - tonyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接