我正在尝试创建一个小脚本,它将创建我的数据绝对值的日志转换,但是当原始值为零(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()
完成,但我们称之为学习练习......我想了解为什么这不起作用。
答案 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