【发布时间】:2020-11-23 23:49:58
【问题描述】:
我正在尝试根据其他列中的条件找到一种方便的方法来更改列中的值,以便当存在 NA 并且满足条件时,它将替换该值。我有大约 6 列,类似于 A:D,然后是一个二进制列。还有与这些特定行相关的其他数据,例如(日期、位置等)
我在下面做了一些虚拟代码
`%notin%` <- Negate(`%in%`)
ops <- c("Zoo", "Fun", "Party")
df <- data.frame(A = c("Zoo", "Beer", "Rave", "Fun", "school"),
B = c("school", NA, "Beer", "exams", "Beer"),
C = c("Fun", NA, NA, "Party", "Rave"),
D = c(NA, NA, NA, "Rave", NA),
X = c(1,0,1,0,0))
df$B[which((df$A %notin% ops | df$B %notin% ops |
df$C %notin% ops) & df$X == 0 & is.na(df$B))] <- "HELP"
df$C[which((df$A %notin% ops & df$B %notin% ops &
df$C %notin% ops) & df$X == 0 &
df$B != "HELP" & is.na(df$C))] <- "HELP"
df$D[which((df$A %notin% ops & df$B %notin% ops &
df$C %notin% ops) & df$X == 0 &
df$B != "HELP" & df$C != "HELP" &
is.na(df$D))] <- "HELP"
如您所见,此代码逐渐变得更加混乱且难以遵循。当我发现新的问题时,它会以这种方式逐渐增长......我知道必须有一种更清洁的方式来写这个,但我无法为我的生活弄明白。我对 tidyverse(ish) 非常熟悉——更不用说寻找 data.table 解决方案了……但基本 R 解决方案也是天赐之物。
目前,我还有其他几个带有类似条件的代码块(这就是为什么拥有一个真正有效的解决方案只是清理这段代码的巨大飞跃)。
编辑:在要求解释我正在尝试做的事情时,让我更清楚地解释一下。
当我想要更改满足某些条件的行值时,我想要一个更优雅的解决方案。在这里,每一行是一个分类调查响应,其中ops 包含我感兴趣的 3 个分类变量。X 是一个虚拟变量(实际上只是布尔值)。
为方便起见(为了不混淆下面的答案,我将稍微更改 df。
df <- data.frame(A = c("Zoo", "Beer", "Rave", "Fun", "school", "blah"),
B = c("school", NA, "Beer", "exams", "Beer", "blah"),
C = c("Fun", NA, NA, "Party", "Rave", NA),
D = c(NA, NA, NA, "Rave", NA, NA),
X = c(1,0,1,0,0,1))
目标是在行不包含 ops & X==0
的情况下更改第一个 NA但是,我也不想更改所有 NA - 我只想更改第一个 NA,如果它满足条件(即行包含 ops & X == 0)并且我不知道 在哪里 第一个 NA 将出现在数据中,但我知道在第一个 NA 之后,如果有更多列,其余的将是 NA,直到 X。
如果我们选择第 5 行:
ops 不在 A, B, C, D & X == 0 & is.na(D) 因此 [5,5] == "HELP"
如果我们选择第 2 行:
ops不在A, B, C,D & B is.na & C is.na, D is.na & X==0 但我只想改变NA的第一次出现
添加的新行 (6)
ops 不在 A、B、C、D 中,但 X == 0。在这种情况下,我仍然希望“帮助”出现在第一个 NA 所在的位置。
我不知道我是否让这更令人困惑 - 抱歉,我不是计算机科学家,但这基本上是我试图实现的逻辑结构,而不必更改每一行。根据不同的条件,我有 2 次使用不同版本的“HELP”再执行 2 次,然后排除了 HELP 这个词......所以它开始变得难以解析。
【问题讨论】:
-
很好地提供了您的编码尝试,但如果您退后一步并只是解释您正在尝试做什么,这将是有帮助的。似乎当二进制列是
0并且该行不包含ops中的任何单词时,您希望将第一个逐行NA替换为HELP。是这样吗? -
是的,对不起。我正在处理机密数据(暂时) - 所以我试图提供一个有点好玩的虚拟数据。 ^上面的代码实际上适用于我需要它做的事情 - 它只是凌乱且难以使用。
-
@27ϕ9 我已经添加了更深入的解释,但是基本上就是这样。我的问题是,在此之后我必须再次执行此操作,然后也写!=“帮助”...也许它只是需要弄乱,但是当条件 A、B 时必须有一种更简单的方法来替换第一个行& C 满足