簡體   English   中英

如何使用R將兩個或幾個變量轉換(計算)為一個?

[英]How to transform (calculate) two or several variables into one using R?

我在合並數據中的兩個或幾個變量時遇到一些困難。 我可以在Excel中執行此操作,但無法弄清楚如何在R中執行相同的操作。

基本上,我想使用以下變量創建兩個組合變量:

數據1:創建變量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,則CombineA1 + B1也應具有NA。 如果一個具有NA值,另一個具有1或0值,則應給出相應的數字(請參見ex USA 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?

感謝您提出的所有建議以正確添加這些變量。

經過一點搜索,我找到了這篇文章 我不相信這個代碼。

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

為了使R丟棄NA,而不是通過計算傳播它們,許多函數都有一個可選的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)

您可能尚未遇到...定義函數-它的目的是采用任意數量的可選參數並將其保留為“傳遞”,在這種情況下為csum

這是一個帶有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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM