我在合并数据中的两个或几个变量时遇到了一些困难。我能够在Excel中完成它,但无法弄清楚如何在R中执行相同的操作。
基本上我想使用以下变量创建两个组合变量:
Data1:创建变量CombineA + B
country year A1 B1 **combineA1+B1**
USA 2002 0 0 0
USA 2003 1 1 2
USA 2004 NA 1 1
USA 2005 0 0 0
USA 2006 0 1 1
USA 2007 0 0 0
USA 2008 0 1 1
USA 2009 NA NA NA
USA 2010 0 1 1
USA 2011 NA 0 0
USA 2012 0 1 1
USA 2013 0 0 0
USA 2014 0 1 1
创建变量" combineA1 + B1"看起来很简单,我需要做的就是添加这两个(A1和B1)。在Excel中这很简单,我想它也在R中。但是,NA值在添加这两个变量时会产生问题。那么,如何创建一个像上面那样的combineA1 + B1变量?
如果A1和B1都有NA' s,则combineA1 + B1也应该有NA。如果一个具有NA值而另一个具有1或0值,则应该给出相应的数字(参见前美国2004)。
我还想创建另一个组合变量:" combineA1 + B1 + C1 + D1"
数据2:创建变量" combineA1 + B1 + C1 + D1"
country year A1 B1 C1 D1 combineABCD
USA 2002 0 0 0 0 0
USA 2003 1 1 0 0 2
USA 2004 NA 1 0 0 1
USA 2005 0 0 0 0 0
USA 2006 0 1 0 0 1
USA 2007 0 0 0 0 0
USA 2008 0 1 1 0 2
USA 2009 NA NA NA NA NA
USA 2010 0 1 1 0 2
USA 2011 NA 0 0 0 0
USA 2012 0 1 1 0 2
USA 2013 0 0 0 0 0
USA 2014 0 1 1 0 2
我想,一旦我知道如何创建第一个组合变量,我也能够做到这一点。虽然我不确定如何处理所有这些NA?
感谢您提出的所有建议,以便正确添加这些变量。
答案 0 :(得分:2)
通过一点搜索,我找到了this article。我不相信这段代码。
mysum <- function(x) if (all(is.na(x))) NA else sum(x, na.rm=T)
df$combinedA1B1 <- apply(df[, c("A1", "B1")], 1, mysum)
df
# country year A1 B1 combinedA1B1
# 1 USA 2002 0 0 0
# 2 USA 2003 1 1 2
# 3 USA 2004 NA 1 1
# 4 USA 2005 0 0 0
# 5 USA 2006 0 1 1
# 6 USA 2007 0 0 0
# 7 USA 2008 0 1 1
# 8 USA 2009 NA NA NA
# 9 USA 2010 0 1 1
# 10 USA 2011 NA 0 0
# 11 USA 2012 0 1 1
# 12 USA 2013 0 0 0
# 13 USA 2014 0 1 1
答案 1 :(得分:1)
要让R删除NAs而不是通过计算传播它们,许多函数都有一个可选的na.rm
参数。它默认为FALSE
,但将其设置为TRUE
会导致R忽略计算中的NAs:
> sum(1, NA)
[1] NA
> sum(1, NA, na.rm = TRUE)
[1] 1
但是,当所有的参数都是NA
时,传递此参数会导致棘手的行为,因为R仍然决定忽略它们:
> sum(NA, NA, na.rm = TRUE)
[1] 0
要获得所需的NA处理,您可以定义自己的功能:
my.sum <- function(...) {
if(all(is.na(c(...)))) {
return(NA)
} else {
return(sum(..., na.rm = TRUE))
}
}
完成后,您可以使用mapply
将两列压缩在一起,如下所示:
data1$combine <- mapply(data1$A1, data1$B1, FUN = my.sum)
你可能还没有遇到...
来定义函数 - 它的目的是获取任意数量的可选参数并将它们保存到&#34;传递&#34;,在这种情况下传递给{{1 }和c
。
答案 2 :(得分:1)
这是一个dplyr包:
df <- data.frame(country = rep("USA", 13),
year = 2002:2014,
A1 = c(0,1,NA,0,0,0,0,NA,0,NA,0,0,0),
B1 = c(0,1,1,0,1,0,1,NA,1,0,1,0,1)
n)
df <- df %>% mutate(combine = ifelse(is.na(A1), B1,
ifelse(is.na(B1), A1, A1 + B1)))