以R data.frame中的值为条件获取日志

以R data.frame中的值为条件获取日志,r,R,我有一些数据,我需要记录下来。但是我有一些NA值和0。默认情况下,R使log(0)=NA,但我需要区分0和NA。因此,我试图告诉R只计算与零不同的值的log。我尝试了几种规格,但都失败了x是一个数据框架,维度为N x M,列为变量,行为观察值。像这样的 x <- cbind(c(3,4,0,0), c(0,5,NA,6),c(0,2,NA,NA)) x <- data.frame(x) x [,1] [,2] [,3] [1,] 3 0 0 [2,]

我有一些数据,我需要记录下来。但是我有一些NA值和0。默认情况下,R使log(0)=NA,但我需要区分0和NA。因此,我试图告诉R只计算与零不同的值的log。我尝试了几种规格,但都失败了
x
是一个数据框架,维度为
N x M
,列为变量,行为观察值。像这样的

x <- cbind(c(3,4,0,0), c(0,5,NA,6),c(0,2,NA,NA))
x <- data.frame(x)
x
     [,1] [,2] [,3]
[1,]    3    0    0
[2,]    4    5    2
[3,]    0   NA   NA
[4,]    0    6   NA
我错在哪里?还有其他更有效的方法来做我想做的事吗?

x在R:
log(0)=-Inf
而不是
NA

x <- cbind(c(3,4,0,0), c(0,5,NA,6),c(0,2,NA,NA)) # Your data and output
x <- data.frame(x)
x[!is.na(x) & x > 0] <- log(x[!is.na(x) & x > 0]) # My solution
#        X1       X2        X3
#1 1.098612 0.000000 0.0000000
#2 1.386294 1.609438 0.6931472
#3 0.000000       NA        NA
#4 0.000000 1.791759        NA
> x <- cbind(c(3,4,0,0), c(0,5,NA,6),c(0,2,NA,NA))
> apply(x,1:2,log)
         [,1]     [,2]      [,3]
[1,] 1.098612     -Inf      -Inf
[2,] 1.386294 1.609438 0.6931472
[3,]     -Inf       NA        NA
[4,]     -Inf 1.791759        NA
>x应用(x,1:2,日志)
[,1]     [,2]      [,3]
[1,]1.098612-Inf-Inf
[2,] 1.386294 1.609438 0.6931472
[3,]-Inf-NA-NA
[4,]-Inf 1.791759 NA

在您给出的示例中,您的
x
不是一个data.frame,而是一个矩阵。所以我给了你们一个矩阵的解。如果您想将其用于data.frame,请提供一个示例,该示例是data。frame@Bob如果强制日志(0)为0,那么如何将日志(1)与其区分?实际上,R将log(0)转换为-Inf,将log(NA)转换为NA。现在
x
是一个
data.frame
@xb。没错,但我的数据中没有1。@如果有任何小于1的值,Bob也会使结果变得不合理。为什么不避开它,以便更安全、更好地练习?@xb。我不明白为什么
0的结果部分起作用。但是,它用NA替换0。我尝试了以下
data\u log[data\u sub==0]但没有。请看输出,我已将您的数据集添加到答案中,任何人都可以对其进行测试并证明我是正确的。使用您在文章中提供的数据集运行代码。它不流动。如果您希望此代码用于data.frame,请提供另一个示例data和data.frame(而不是matrix)。此代码与您的data.frame完美配合。你试过运行它吗?只需运行
x[!is.na(x)&x>0]0])
并查看您得到了什么
x_log <- matrix(NA, dim(x)[1], dim(x)[2])
for (i in 1:dim(x)[1])
for (j in 1:dim(x)[2])
{ if (x[i,j] == 0) { x_log[i,j] <- x[i,j]}
 else {x_log[i,j] <- log(x[i,j])}
}
Error in if (x[i, j] == 0) { : 
missing value where TRUE/FALSE needed
x <- cbind(c(3,4,0,0), c(0,5,NA,6),c(0,2,NA,NA)) # Your data and output
x <- data.frame(x)
x[!is.na(x) & x > 0] <- log(x[!is.na(x) & x > 0]) # My solution
#        X1       X2        X3
#1 1.098612 0.000000 0.0000000
#2 1.386294 1.609438 0.6931472
#3 0.000000       NA        NA
#4 0.000000 1.791759        NA
> x <- cbind(c(3,4,0,0), c(0,5,NA,6),c(0,2,NA,NA))
> apply(x,1:2,log)
         [,1]     [,2]      [,3]
[1,] 1.098612     -Inf      -Inf
[2,] 1.386294 1.609438 0.6931472
[3,]     -Inf       NA        NA
[4,]     -Inf 1.791759        NA