[英]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)
您可能尚未遇到...
定義函數-它的目的是采用任意數量的可選參數並將其保留為“傳遞”,在這種情況下為c
和sum
。
這是一個帶有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.