r-如何使用for循环命令?



我需要创建变量"peace"它告诉我在变量conflict==1(表示冲突开始)之前有多少年是和平的。

有人建议我用一个变量("peace")做一个for循环,从0开始,如果conflict==0加1,如果conflict==1保存值,然后把它放回0。

这里有一个简短的例子,说明变量"peace"应该看起来像:

Df <- data.frame(country = c("A", "A", "A", "A", "A", "B","B", "B", "B"),
year = c("1950", "1951", "1952", "1953", "1954", "1950", "1951", "1952", "1953"),
conflict = c(0, 0, 1, 1, 0, 0, 1, 0, 1), peace = c(0, 0, 2, 2, 0, 0, 1, 0, 1))

实现"和平"的最佳途径是什么?代码看起来会是什么样子?

谢谢!

我创建了一个名为n的新变量作为输出-

library(dplyr)
Df <- Df %>% mutate(grp = data.table::rleid(conflict))
Df %>%
count(country, grp) %>%
group_by(country) %>%
mutate(n = lag(n, default = 0)) %>%
ungroup %>%
left_join(Df, by = c('country', 'grp')) %>%
mutate(n = replace(n, conflict == 0, 0))
#  country   grp     n year  conflict peace
#  <chr>   <int> <dbl> <chr>    <dbl> <dbl>
#1 A           1     0 1950         0     0
#2 A           1     0 1951         0     0
#3 A           2     2 1952         1     2
#4 A           2     2 1953         1     2
#5 A           3     0 1954         0     0
#6 B           3     0 1950         0     0
#7 B           4     1 1951         1     1
#8 B           5     0 1952         0     0
#9 B           6     1 1953         1     1

查看此链接了解R中的基本循环:https://www.geeksforgeeks.org/loops-in-r-for-while-repeat/

对于您的问题,您可能希望遍历每个行索引,除了第一个

# these two lines do two very different things. See if you can spot it.
peace <- 1
Df$peace <- 0
for (i in 2:nrow(Df)) {
# compare row i-1 to i
if (Df$country[i] != Df$country[i-1]) {
peace <- 1
next
}
if (Df$conflict[i] == 0 && Df$conflict[i-1] == 1) {
peace <- 1
} else if (Df$conflict[i] == 0) {
peace <- peace + 1
} else {
Df$peace[i] <- peace
}
}

最新更新