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)