[英]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.