添加变量,同时使用变换功能忽略NA

时间:2012-08-27 09:32:32

标签: r

我有一个包含大量变量的数据框。我通过将一些旧变量加在一起来创建新变量。我用来做的代码是:

name_of_data_frame<- transform(name_of_data_frame, new_variable=var1+var2 +....)

当变换在其中一个观察中遇到NA时,它返回&#34; NA&#34;在新变量中,即使它添加的其他一些变量也不是NA。

e.g。如果var1= 4var2=3var3=NA,然后使用transform,如果我var1+var2+var3它会发出NA,而我希望它给我7。

我不想在数据框中将NA重新编码为零,因为我可能需要稍后再参考NA,所以不要将NA与真实0的观察结果混淆起来。

如何以上述方式使用转换函数来解决R处理NA的任何帮助都会很棒(或者如果有其他函数可供使用,那也很棒。)

请注意,我并不只是总结彼此相邻的变量,我也常常将变量,乘法,减去等分开。

2 个答案:

答案 0 :(得分:10)

我的第一直觉是建议使用sum(),因为那时您可以使用na.rm参数。但是,这不起作用,因为sum()将参数减少为单个标量值,而不是向量。

这意味着您需要编写parallel sum函数。我们称之为psum(),类似于基本R函数pmin()pmax()

psum <- function(..., na.rm=FALSE) { 
  x <- list(...)
  rowSums(matrix(unlist(x), ncol=length(x)), na.rm=na.rm)
} 

现在设置一些数据并使用psum()来获得所需的向量:

dat <- data.frame(
  x = c(1,2,3, NA),
  y = c(NA, 4, 5, NA))

transform(dat, new=psum(x, y, na.rm=TRUE))
   x  y new
1  1 NA   1
2  2  4   6
3  3  5   8
4 NA NA   0

同样,您可以像这样定义parallel productpprod()

pprod <- function(..., na.rm=FALSE) { 
  x <- list(...)
  m <- matrix(unlist(x), ncol=length(x))
  apply(m, 1, prod, na.rm=TRUE)
} 

transform(dat, new=pprod(x, y, na.rm=TRUE))
   x  y new
1  1 NA   1
2  2  4   8
3  3  5  15
4 NA NA   1

pprod示例为您要执行的操作提供了一个通用模板:创建一个函数,使用apply()将输入矩阵汇总到所需的向量中。

答案 1 :(得分:2)

使用rowSumsprod可以帮助您。

set.seed(007) # Generating some data
DF <- data.frame(V1=sample(c(50,NA,36,24,80, NA), 15, replace=TRUE),
                 V2=sample(c(70,40,NA,25,100, NA), 15, replace=TRUE),
                 V3=sample(c(20,26,34,15,78,40), 15, replace=TRUE))

transform(DF, Sum=rowSums(DF, na.rm=TRUE)) # Sum (a vector of values)
transform(DF, Prod=apply(DF, 1, FUN=prod, na.rm=TRUE)) # Prod (a vector of values)

# Defining a function for substracting (resta, in spanish :D)
resta <- function(x) Reduce(function(a,b) a-b,  x <- x[!is.na(x)])
transform(DF, Substracting=apply(DF, 1, resta))

# Defining a function for dividing 
div <- function(x) Reduce(function(a,b) a/b,  x <- x[!is.na(x)])
transform(DF, Divsion=apply(DF, 1, div))