用 R 中一行中的下一个不同数字替换列中的给定值

replace a given value within a column with the next different number in a row in R

我有一个数据集,最终将包含约 30,000 个观察值。我已经格式化了一个变量,使得数值 1:4 很有趣,而值 5 是一个占位符并且由于某种原因无法被我们的测试仪器收集(不担心为什么或缺失等)。

我希望将对 5 的任何观察结果或对 5 的一系列观察结果转换为观察结果中的下一个数字。从下面的示例数据集中可以看出,前四个观测值的编号为 5,而接下来的四个观测值的编号为 4。在这种情况下,我希望将前 4 个观测值从 5 更改为 4。

请注意,在第 8 次观察之后,又出现了一系列 5,随后是一系列 3。在这种情况下,应将 5s 更改为 3s。

在下面的代码块中,我提供了当前数据的示例,由“当前”列描述。我还提供了一列所需的输出,用列名“Desired”描述。 obs 变量有助于创建,只是为了显示此 post.

情况下值更改的行号
df <- data.frame(Current = c(5,5,5,5,4,4,4,4,5,5,3,3,3,5,3,3,5,5,2,5,5,5,1),
                 Desired = c(4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,2,2,2,1,1,1,1))

df$obs = seq(1,nrow(df), by = 1)

你可以使用

library(tidyr)
library(dplyr)

df %>% 
  mutate(new_column = na_if(Current, 5)) %>% 
  fill(new_column, .direction = "up")

这个returns

   Current Desired new_column
1        5       4          4
2        5       4          4
3        5       4          4
4        5       4          4
5        4       4          4
6        4       4          4
7        4       4          4
8        4       4          4
9        5       3          3
10       5       3          3
11       3       3          3
12       3       3          3
13       3       3          3
14       5       3          3
15       3       3          3
16       3       3          3
17       5       2          2
18       5       2          2
19       2       2          2
20       5       1          1
21       5       1          1
22       5       1          1
23       1       1          1
  • 我们使用dplyrna_if函数将5转换为缺失值。
  • 接下来我们使用 tidyrfill 函数将 NA 替换为以下值。

您可以使用以下解决方案。我使用了 zoo::na.locf 函数,该函数采用最多的非 NA 值并在下降的过程中替换所有 NA。但是,为了使它适合您的数据集,我首先将所有等于 5 的值替换为 NA,然后反转向量,在用所需值替换所有值后,我再次将其反转回它的原始顺序:

library(dplyr)
library(zoo)

library(zoo)

df %>%
  mutate(Desired2 = ifelse(Current == 5, NA, Current), 
         Desired2 = rev(na.locf(rev(Desired2))))

   Current Desired Desired2
1        5       4        4
2        5       4        4
3        5       4        4
4        5       4        4
5        4       4        4
6        4       4        4
7        4       4        4
8        4       4        4
9        5       3        3
10       5       3        3
11       3       3        3
12       3       3        3
13       3       3        3
14       5       3        3
15       3       3        3
16       3       3        3
17       5       2        2
18       5       2        2
19       2       2        2
20       5       1        1
21       5       1        1
22       5       1        1
23       1       1        1