【问题标题】:How do I use the command for for-loops?如何将命令用于 for 循环?
【发布时间】:2021-12-10 18:58:12
【问题描述】:

我需要创建变量“peace”,它告诉我在变量conflict==1(意味着冲突开始)之前已经和平了多少年。

有人建议我做一个for-loop,变量(“和平”)以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))

实现“和平”的最佳方式是什么?代码会是什么样子?

谢谢!

【问题讨论】:

  • 请修复您的可重现示例。 AB 是不是您没有包含或忘记引用它们?

标签: r for-loop


【解决方案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
  }
}

【讨论】:

    【解决方案2】:

    我创建了一个名为 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
    

    【讨论】:

    • 非常感谢!这工作得很好!
    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多