R 将数据帧中的列与部分信息组合在一起

R 将数据帧中的列与部分信息组合在一起,r,dplyr,R,Dplyr,我有一个大的数据集,在不同的时间段对相同的变量使用不同的编码方案。每个时间段中的编码都表示为一列,列中的值在其活动的年份内,其他地方为NA 我能够通过使用嵌套的ifelse命令和dplyr的mutate(参见下面的编辑)来“组合”它们,但是我在使用ifelse做一些稍微不同的事情时遇到了问题。我想根据前面的变量是否满足条件来编写一个新变量。但由于某些原因,下面的ifelse构造不起作用 MWE: 期望输出: > df id year varA varB varC 1 1 1995

我有一个大的数据集,在不同的时间段对相同的变量使用不同的编码方案。每个时间段中的编码都表示为一列,列中的值在其活动的年份内,其他地方为NA

我能够通过使用嵌套的ifelse命令和dplyr的mutate(参见下面的编辑)来“组合”它们,但是我在使用ifelse做一些稍微不同的事情时遇到了问题。我想根据前面的变量是否满足条件来编写一个新变量。但由于某些原因,下面的ifelse构造不起作用

MWE:

期望输出:

> 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>

根据@Khashaa评论。这应该可以做到这一点,并使您获得所需的输出

df %>%
  mutate(varC = ifelse(is.na(varA) & is.na(varB), NA, 
                       ifelse(varA %in% "C" | varB %in% "C", "C", "D")))

R有一个恼人的倾向,即涉及NA的条件的逻辑值只是NA,而不是真或假。 i、 e.NA>0=NA而非FALSE

NA与TRUE的交互作用就像false一样。i、 e.正确| NA=正确。真&NA=NA

有趣的是,它还与FALSE交互,就好像它是真的一样。i、 e.假| NA=NA。FALSE&NA=FALSE

事实上,NA就像一个介于真与假之间的逻辑值。e、 g.NA |真|假=真

因此,这里有一种破解方法:

ifelse((varA=='C'&!is.na(varA))|(varB=='C'&!is.na(varB))
我们如何解释这一点?在OR的左侧,我们有以下内容:如果varA是NA,那么我们有NA&FALSE。因为NA在逻辑层次结构中比FALSE高一步,&将迫使整个事物为FALSE。否则,如果varA不是NA,但它不是‘C’,那么您将得到FALSE和TRUE,这会给出您想要的FALSE。否则,如果是“C”,它们都是真的。手术室右边的东西也是一样

当使用涉及x的条件时,但x可以是NA,我喜欢使用 ((x的条件)&!is.na(x))完全排除na输出,并在我想要的情况下强制使用真值或假值

编辑:我刚刚记得,如果它们都是NA,则需要NA输出。这并没有结束,所以这是我的错。除非你对“D”输出满意,当它们都是NA时

EDIT2:这将根据需要输出NAs:

ifelse(is.na(varA)&is.na(varB), NA, ifelse((varA=='C'&!is.na(varA))|(varB=='C'&!is.na(varB)), 'C','D'))

看看
df$varA==“C”| df$varB==“C”
Huh的输出。我应该考虑检查一下。我不能用我的原始数据集(1 mil+观测值)来做这件事,但用MWE它是可行的。谢谢然而,关于如何修复它的问题仍然存在。请注意,
NA==“C”
返回
NA
,而
NA%in%“C”
FALSE
,现在我唯一的问题是,在我的真实数据集中,我有6个比较,所以我不得不键入它们两次,一次输入is.NA,另一次输入%in%。。。但它起作用了,所以我很高兴。一整天都在为此奋斗<代码>=应比%中的
%快。因为您只检查一个字符串。谢谢您的解释。当你认为NA是一个“未知”值时,NA在比较真与假时的行为实际上是有意义的。真| NA永远是真的,同样是假的&NA永远是假的,不管NA变成什么。但这会导致一些令人沮丧的行为
> 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 %>%
  mutate(varC = ifelse(is.na(varA) & is.na(varB), NA, 
                       ifelse(varA %in% "C" | varB %in% "C", "C", "D")))
ifelse((varA=='C'&!is.na(varA))|(varB=='C'&!is.na(varB))
ifelse(is.na(varA)&is.na(varB), NA, ifelse((varA=='C'&!is.na(varA))|(varB=='C'&!is.na(varB)), 'C','D'))