提问人:Yusuf 提问时间:11/25/2022 更新时间:11/25/2022 访问量:34
在 R 中有条件地更改行的值
Change the values of rows conditionally in R
问:
我的数据如下所示:
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)
答:
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
评论
1
1