r - 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])
}
任何想法如何获得正确的输出?
解决方案
这里有两种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)
推荐阅读
- oracle - 将 blob 列中的 pdf 存储到数据库表中,以顶点形式/区域的 pdf 预览?
- python-3.x - 如何知道呼出电话的状态?
- google-apps-script - 谷歌脚本:ui.prompt,按回车而不是点击按钮提交
- asp.net-mvc - 如何使用 C# 通过异步方法使用 Task.WaitAll
- java - ANTLR 语法行 1:6 不匹配的输入 '
'期待'。 - c++ - 在这种情况下,(N)RVO 会与我的功能一起应用吗?
- tensorflow - Google Cloud 平台上的对象检测批量预测失败
- jquery - Multi-Select DropDown:仅禁用所选选项(jQuery)
- ms-access - 使用报告字段在当前记录处打开表单
- opencl - 如何在没有设备到主机传输的情况下将 2D 纹理 DXGI_FORMAT_B8G8R8A8_UNORM 转换为 DXGI_FORMAT_R8G8B8A8_UNORM?