如何使行遵循R中的模式

yrdbyhpb  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(98)

我希望x1列遵循一种模式。在x1列中,如果该列中的前一行是2018,则我希望将下一行设为2017。此外,如果前一行是2016,则我希望下一行是2018。

g <- data.frame("x1" = c(2018,"NA",2016,2016,"NA",2018,2017,2016,"NA"),
                "x2" = c(2,2,2,1,4,3,4,1,1),
                "x3" = c(22,22,23,24,25,26,27,28,29))

我正在使用一个大型数据集,但这是我的数据样本。
预期成果:

g <- data.frame("x1" = c(2018,2017,2016,2016,2018,2018,2017,2016,2018),
                "x2" = c(2,2,2,1,4,3,4,1,1),
                "x3" = c(22,22,23,24,25,26,27,28,29))
ubof19bj

ubof19bj1#

假设你的“NA”值是NA,一种方法是在dplyr::mutate中使用dplyr::case_when

library(dplyr)

g2 <- g %>%
  mutate(x1 = case_when(
    is.na(x1) & lag(x1) == 2018 ~ 2017,
    is.na(x1) & lag(x1) == 2016 ~ 2018,
    TRUE ~ x1
  ))

输出:

x1 x2 x3
1 2018  2 22
2 2017  2 22
3 2016  2 23
4 2016  1 24
5 2018  4 25
6 2018  3 26
7 2017  4 27
8 2016  1 28
9 2018  1 29

如果它们真的是字符变量"NA",就像示例数据中的那样,您只需将上面的代码更改为:

g <- g %>%
  mutate(x1 = case_when(
    x1 == "NA" & lag(x1) == "2018" ~ "2017",
    x1 == "NA" & lag(x1) == "2016" ~ "2018",
    TRUE ~ x1
  ))
jrcvhitl

jrcvhitl2#

我们可以这样做:这里我们使用case_when。在我们使用type.conver(as.is = TRUE)将x1转换为数值之前,然后应用给定的条件:

library(dplyr)

g %>% 
  type.convert(as.is=TRUE) %>% 
  mutate(x1 = case_when(is.na(x1) & lag(x1) == 2018 ~2017,
                        is.na(x1) & lag(x1) == 2016 ~2018,
                        TRUE ~ x1))

    x1 x2 x3
1 2018  2 22
2 2017  2 22
3 2016  2 23
4 2016  1 24
5 2018  4 25
6 2018  3 26
7 2017  4 27
8 2016  1 28
9 2018  1 29

相关问题