R 用分数序列填充缺少的值

R 用分数序列填充缺少的值,r,dplyr,R,Dplyr,我有这样一个数据框: df <- data.frame(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2), interval = c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3), value = c(1, 0, 0, 0, 0, 0, 100, 1, 0, 50)) 其中,ID 1的每个增量为 val7-val1/(行号(7)-行号(1)) 但它必须通过指定每个组的非零行号来工

我有这样一个数据框:

df <- data.frame(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2),
                  interval = c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3),
                  value = c(1, 0, 0, 0, 0, 0, 100, 1, 0, 50))
其中,ID 1的每个增量为

val7-val1/(行号(7)-行号(1))

但它必须通过指定每个组的非零行号来工作,即id号。填写的值只是分数,因此呈线性趋势。如果它能以某种方式使用非线性或加权趋势,则可获得加分

如果解决方案允许我在dplyr链中执行此操作,则可获得额外积分。这可能很简单,我只是在措辞上空白

为清晰输出而编辑。我不想只粘贴行号或整数序列,而是将两个值的分数差添加到前一行的值中

编辑:值之间的差异可能不是正的。而且,它并不总是从第一行开始。它也可以如下所示:

df <- data.frame(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2),
                  interval = c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3),
                  value = c(1, 0, 0, 100, 0, 0, 50, 10, 10, 50))
一个选择是

library(dplyr)
df %>%
   group_by(id) %>%
   mutate(value = row_number())
# A tibble: 10 x 3
# Groups:   id [2]
#      id interval value
#   <dbl>    <dbl> <int>
# 1     1        1     1
# 2     1        2     2
# 3     1        3     3
# 4     1        4     4
# 5     1        5     5
# 6     1        6     6
# 7     1        7     7
# 8     2        1     1
# 9     2        2     2
#10     2        3     3

基本的R解决方案是使用
ave

df$value2 <- ave(df$id, df$id, FUN = seq_along)
identical(df$value, df$value2)
#[1] TRUE

df$value2根据每个ID或每个间隔的先前差异得出的非线性趋势?你能用一个你的意思的输出例子来编辑这个问题吗?我编辑了我的文章,但这绝对不是一个仅仅粘贴行号就足够的解决方案。我修改了样本数据和输出以反映这一点。这两个链接都不够。如果间隔不是1度的增量,则此选项不起作用。如果间隔数和值不相同,则此值是否起作用?在OP编辑后,
baseR
选项将是
df$value2@markus,由于某种原因,该选项不适用于我的实际数据。我在样本或实际数据中没有NA值,但我的实际数据在大约(x,xout=seq_沿着(x))中抛出错误
错误:需要至少两个非NA值来插值
,当我在replace(arr_change,arr_change==0)中删除NA部分
错误时:缺少参数“values”,没有默认值

library(dplyr)
df %>%
   group_by(id) %>%
   mutate(value = row_number())
# A tibble: 10 x 3
# Groups:   id [2]
#      id interval value
#   <dbl>    <dbl> <int>
# 1     1        1     1
# 2     1        2     2
# 3     1        3     3
# 4     1        4     4
# 5     1        5     5
# 6     1        6     6
# 7     1        7     7
# 8     2        1     1
# 9     2        2     2
#10     2        3     3
df %>% 
   group_by(id) %>% 
   mutate(value1 = seq(value[1], value[n()], by = (value[n()] - value[1])/(n() -1)))
# A tibble: 10 x 4
# Groups:   id [2]
#      id interval value value1
#   <dbl>    <dbl> <dbl>  <dbl>
# 1     1        1     1    1  
# 2     1        2     0   17.5
# 3     1        3     0   34  
# 4     1        4     0   50.5
# 5     1        5     0   67  
# 6     1        6     0   83.5
# 7     1        7   100  100  
# ...
df %>%
    mutate(value = na_if(value, 0)) %>%
    group_by(id) %>% 
    mutate(value = approx(value, xout = row_number())$y)
# A tibble: 10 x 3
# Groups:   id [2]
#      id interval value
#   <dbl>    <dbl> <dbl>
# 1     1        1   1  
# 2     1        2  17.5
# 3     1        3  34  
# 4     1        4  50.5
# 5     1        5  67  
# 6     1        6  83.5
# 7     1        7 100  
# ...
df$value2 <- ave(df$id, df$id, FUN = seq_along)
identical(df$value, df$value2)
#[1] TRUE
df <- read.table(text = "
id interval value
   1        1     1
   1        2     2
   1        3     3
   1        4     4
   1        5     5
   1        6     6
   1        7     7
   2        1     1
   2        2     2
   2        3     3
", header = TRUE)