首页 > 解决方案 > r for 循环与 if else 语句和对先前迭代结果的引用

问题描述

我有一个带有字段 x 的数据框,其中包含组名(在下面的示例中标记为字母)和组成员(列组名下,标记为数字)。我想创建一个字段,为每个成员显示其组的名称。在下面的数据框中,所需的输出显示在“结果”列中。

df <- data.frame("x"=c("A","1","2","B","C","1","2","C","D","1"),
                 "outcome"=c("A","A","A","B","C","C","C","C","D","D")
) %>%
  mutate(
    Letter = ifelse(grepl("[A-Za-z]", x) == T,"Letter",
                      "No Letter")
  )

我的想法是通过 forloop 做到这一点。如果 x 是一个字母,它应该返回那个字母,如果不是,它应该返回前一个循环的结果(这是在 x 中找到的前一个字母)。下面的 forloop 没有给出正确的输出:

df$outcome_calc[1] <- "A" 
for (i in 2:10) {  
  df$outcome_calc[i] <- ifelse(df$Letter[i] == "No Letter",df$outcome_calc[i-1],df$x[i])    

}

任何想法如何获得正确的输出?

标签: rfor-loop

解决方案


这里有两种tidyverse方法,非常相似,使用便利功能zoo::na.locf

第一的:

library(tidyverse)

df %>%
  mutate(na = is.na(as.numeric(as.character(x))),
         outcome2 = ifelse(na, as.character(x), NA_character_),
         outcome2 = zoo::na.locf(outcome2)) %>%
  select(-na)

另一个:

df %>%
  mutate(chr = !grepl("[[:digit:]]", x),
         outcome2 = ifelse(chr, as.character(x), NA_character_),
         outcome2 = zoo::na.locf(outcome2)) %>%
  select(-chr)

推荐阅读