【发布时间】:2015-03-06 20:51:01
【问题描述】:
我有一个大型数据集,在不同的时间段内对相同的变量使用不同的编码方案。每个时间段的编码都表示为一列,其中包含其活跃年份的值,而其他任何地方的值为 NA。
我能够通过使用嵌套的 ifelse 命令和 dplyr 的 mutate [参见下面的编辑] 来“组合”它们,但是我在使用 ifelse 做一些稍微不同的事情时遇到了问题。我想根据任何先前的变量是否满足条件来编写一个新变量。但是由于某种原因,下面的 ifelse 构造不起作用。
MWE:
library("dplyr")
library("magrittr")
df <- data.frame(id = 1:12, year = c(rep(1995, 5), rep(1996, 5), rep(1997, 2)), varA = c("A","C","A","C","B",rep(NA,7)), varB = c(rep(NA,5),"B","A","C","A","B",rep(NA,2)))
df %>% mutate(varC = ifelse(varA == "C" | varB == "C", "C", "D"))
输出:
> df
id year varA varB varC
1 1 1995 A <NA> <NA>
2 2 1995 C <NA> C
3 3 1995 A <NA> <NA>
4 4 1995 C <NA> C
5 5 1995 B <NA> <NA>
6 6 1996 <NA> B <NA>
7 7 1996 <NA> A <NA>
8 8 1996 <NA> C C
9 9 1996 <NA> A <NA>
10 10 1996 <NA> B <NA>
11 11 1997 <NA> <NA> <NA>
12 12 1997 <NA> <NA> <NA>
如果我不使用| 运算符,并且仅针对 varA 进行测试,它会得到预期的结果,但它仅适用于 varA 不是 NA 的那些年份。
输出:
> df %<>% mutate(varC = ifelse(varA == "C", "C", "D"))
> df
id year varA varB varC
1 1 1995 A <NA> D
2 2 1995 C <NA> C
3 3 1995 A <NA> D
4 4 1995 C <NA> C
5 5 1995 B <NA> D
6 6 1996 <NA> B <NA>
7 7 1996 <NA> A <NA>
8 8 1996 <NA> C <NA>
9 9 1996 <NA> A <NA>
10 10 1996 <NA> B <NA>
11 11 1997 <NA> <NA> <NA>
12 12 1997 <NA> <NA> <NA>
期望的输出:
> df
id year varA varB varC
1 1 1995 A <NA> D
2 2 1995 C <NA> C
3 3 1995 A <NA> D
4 4 1995 C <NA> C
5 5 1995 B <NA> D
6 6 1996 <NA> B D
7 7 1996 <NA> A D
8 8 1996 <NA> C C
9 9 1996 <NA> A D
10 10 1996 <NA> B D
11 11 1997 <NA> <NA> <NA>
12 12 1997 <NA> <NA> <NA>
我如何获得我正在寻找的东西?
为了使这个问题更适用于更广泛的受众,并从这种情况中学习,最好解释一下使用 | 进行比较时发生的情况,导致它无法按预期工作。提前致谢!
编辑:这就是我将它们与嵌套的 ifelses 成功结合的意思
> df %>% mutate(varC = ifelse(year == 1995, as.character(varA),
+ ifelse(year == 1996, as.character(varB), NA)))
id year varA varB varC
1 1 1995 A <NA> A
2 2 1995 C <NA> C
3 3 1995 A <NA> A
4 4 1995 C <NA> C
5 5 1995 B <NA> B
6 6 1996 <NA> B B
7 7 1996 <NA> A A
8 8 1996 <NA> C C
9 9 1996 <NA> A A
10 10 1996 <NA> B B
11 11 1997 <NA> <NA> <NA>
12 12 1997 <NA> <NA> <NA>
【问题讨论】:
-
看
df$varA == "C" | df$varB == "C"的输出 -
嗯。我应该考虑检查一下。我无法用我的原始数据集(超过 100 万次观察)来做到这一点,但使用 MWE 是可行的。谢谢!不过,问题仍然存在于如何解决它。
-
注意
NA=="C"返回NA,而NA %in% "C"是FALSE