R中的日志数据转换脚本代理“Wonky”

时间:2014-12-15 19:13:10

标签: r matrix transformation data-cleaning

我正在尝试创建一个小脚本,它将创建我的数据绝对值的日志转换,但是当原始值为零(ln(0)==Inf)时,返回所有其他值的最小日志值。列。

以下是示例数据和代码:

bogusdata <- matrix(c(1,2,3,4,5,6,0,-1,-0.25,0,-2,0,-1,-0.5), nrow=7, ncol=2)
colnames(bogusdata)<- c("X","Y")
original.columns <- as.vector(colnames(bogusdata))
for (i in 1:length(original.columns))
{
temp <- as.matrix(bogusdata[,i])
ind <- which(temp[i]==0)
temp[ind] <- NA
temp.log <- log(abs(temp))
min.log <- temp.log[which.min(temp.log)]
temp.log[ind] <- min.log
bogusdata <- cbind(bogusdata, temp.log)
colnames(bogusdata)[length(original.columns)+i] <- paste("L.",original.columns[i], sep="")
}

输出结果为:

> bogusdata
     X     Y       L.X        L.Y
[1,] 1 -1.00 0.0000000  0.0000000
[2,] 2 -0.25 0.6931472 -1.3862944
[3,] 3  0.00 1.0986123       -Inf
[4,] 4 -2.00 1.3862944  0.6931472
[5,] 5  0.00 1.6094379       -Inf
[6,] 6 -1.00 1.7917595  0.0000000
[7,] 0 -0.50      -Inf -0.6931472

打算输出为:

> bogusdata
     X     Y       L.X        L.Y
[1,] 1 -1.00 0.0000000  0.0000000
[2,] 2 -0.25 0.6931472 -1.3862944
[3,] 3  0.00 1.0986123 -1.3862944
[4,] 4 -2.00 1.3862944  0.6931472
[5,] 5  0.00 1.6094379 -1.3862944
[6,] 6 -1.00 1.7917595  0.0000000
[7,] 0 -0.50 0.0000000 -0.6931472

认为我的错误在ind变量中,因为它似乎无法正常运行:

> ind
integer(0)

这对我来说毫无意义。显然temp[i]==0某些单元格......但ind没有抓住它们。

反正。非常感谢您的帮助。

谢谢。

P.S。这可能也可以用is.infinite()完成,但我们称之为学习练习......我想了解为什么这不起作用。

1 个答案:

答案 0 :(得分:2)

您的编码错误在这里:

temp <- as.matrix(bogusdata[,i])
ind <- which(temp[i]==0)

您正在使用i索引两次。您只为您感兴趣的列提取temp矩阵,但之后只查看该列表中的i元素。你真的想要

temp <- as.matrix(bogusdata[,i])
ind <- which(temp==0)

我也可以考虑编写转换函数

trans<-function(x) 
    ifelse(x==0, min(log(abs(x[x!=0]))), log(abs(x)))

然后应用按列完成数据

newcols <- apply(bogusdata,2,trans)
colnames(newcols) <- paste0("L.", colnames(bogusdata))

cbind(bogusdata, newcols)

返回

     X     Y       L.X        L.Y
[1,] 1 -1.00 0.0000000  0.0000000
[2,] 2 -0.25 0.6931472 -1.3862944
[3,] 3  0.00 1.0986123 -1.3862944
[4,] 4 -2.00 1.3862944  0.6931472
[5,] 5  0.00 1.6094379 -1.3862944
[6,] 6 -1.00 1.7917595  0.0000000
[7,] 0 -0.50 0.0000000 -0.6931472