用 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
- 我们使用
dplyr
的na_if
函数将5
转换为缺失值。
- 接下来我们使用
tidyr
的 fill
函数将 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
我有一个数据集,最终将包含约 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
- 我们使用
dplyr
的na_if
函数将5
转换为缺失值。 - 接下来我们使用
tidyr
的fill
函数将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