我有一个包含大量变量的数据框。我通过将一些旧变量加在一起来创建新变量。我用来做的代码是:
name_of_data_frame<- transform(name_of_data_frame, new_variable=var1+var2 +....)
当变换在其中一个观察中遇到NA时,它返回&#34; NA&#34;在新变量中,即使它添加的其他一些变量也不是NA。
e.g。如果var1= 4
,var2=3
,var3=NA
,然后使用transform
,如果我var1+var2+var3
它会发出NA
,而我希望它给我7。
我不想在数据框中将NA
重新编码为零,因为我可能需要稍后再参考NA
,所以不要将NA
与真实0
的观察结果混淆起来。
如何以上述方式使用转换函数来解决R处理NA
的任何帮助都会很棒(或者如果有其他函数可供使用,那也很棒。)
请注意,我并不只是总结彼此相邻的变量,我也常常将变量,乘法,减去等分开。
答案 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 product
或pprod()
:
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)
使用rowSums
和prod
可以帮助您。
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))