在 R 中有条件地更改行的值

Change the values of rows conditionally in R

提问人:Yusuf 提问时间:11/25/2022 更新时间:11/25/2022 访问量:34

问:

我的数据如下所示:

company_name <- c("A","A","A","A","B","B","B")
year <- c(1985, 1986, 1987, 1988, 1985, 1986, 1987)
value <- c(0, 1, 0, 0, 1, 0, 0)

df <- data.frame(company_name, year, value)

如果值为 1,我想将这一行值 (value=1) 与下一行 (value=0) 切换。(group_by应用于company_name)我的输出必须是这样的:

value <- c(0, 0, 1, 0, 0, 1, 0)

new_df <- data.frame(company_name, year, value)
r dplyr tidyverse 数据操作

评论

1赞 zephryl 11/25/2022
如果连续有 2 个或更多 s,会发生什么?如果 a 作为组中的最后一个值出现,该怎么办?11

答:

2赞 jared_mamrot 11/25/2022 #1

这是一个潜在的解决方案:

library(dplyr)

company_name <- c("A","A","A","A","B","B","B")
year <- c(1985, 1986, 1987, 1988, 1985, 1986, 1987)
value <- c(0, 1, 0, 0, 1, 0, 0)

df <- data.frame(company_name, year, value)

answer <- df %>%
  group_by(company_name) %>%
  mutate(value = ifelse(lag(value, default = 0) == 1, lag(value), 0))

value <- c(0, 0, 1, 0, 0, 1, 0)
new_df <- data.frame(company_name, year, value)

all_equal(answer, new_df)
#> [1] TRUE

reprex 包 (v2.0.1) 于 2022-11-25 创建

2赞 zephryl 11/25/2022 #2

使用 和 测试和替换值:dplyr::lag()dplyr::lead()

library(dplyr)

df %>%
group_by(company_name) %>%
  mutate(value = case_when(
    value == 1 ~ lead(value), 
    lag(value) == 1 ~ 1,
    TRUE ~ value
  ))
# A tibble: 7 × 3
# Groups:   company_name [2]
  company_name  year value
  <chr>        <dbl> <dbl>
1 A             1985     0
2 A             1986     0
3 A             1987     1
4 A             1988     0
5 B             1985     0
6 B             1986     1
7 B             1987     0