如何使用R将两个或几个变量转换(计算)为一个?

时间:2016-02-05 15:06:34

标签: r machine-learning

我在合并数据中的两个或几个变量时遇到了一些困难。我能够在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?

感谢您提出的所有建议,以便正确添加这些变量。

3 个答案:

答案 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)))