2017-12-19 34 views
2

로그 변환을 적용하여 R의 데이터 프레임 내부 값을 변경하려고합니다.데이터 프레임에 로그 함수 적용

내 데이터 프레임은 숫자 값으로 구성됩니다. 내가

logFunct <- function(x) log10(x) 
dim(data.frame(logFunct(df)) 

모든 것이 잘 작동이 기능을 적용 할 때 (즉, 20 열 및 dataframe의 20 행 20 열 20 행의 새로운 dataframe로 반환됩니다). 나는이 기능을 0 값을 설명하려고 할 때

그러나 (내가 아는 한, 그것은 아마 못생긴 기능) :

log4Zero <- function(x) ifelse(x!=0, log10(x+0.00000000001), log10(1)) 
dim(data.frame(log4Zero(df)) 

내가 400 열 × 20 개 행을 얻었고, 0 값이 비로서 사로 잡았했다 -zero (0 대신 -11을 리턴).

누구나 여기서 무슨 일이 일어나고 있는지 설명 할 수 있습니다.이 문제를 어떻게 해결할 수 있습니까? 즉, 제로 값을 0으로 설정하고 추가 및 기록하는 다른 방법은 무엇입니까?

+0

왜'로그 (X + 1)를 사용하지'일반적으로? –

+0

내 가치가 꽤 낮습니다. 그 중 많은 수가 0.0001 이하입니다. 그러나 그 생각은 내가 믿는 것과 동일합니다. – kaka01

+1

계산 후 결과를 다시 변환해도 문제가되지 않습니다. –

답변

0

예제를 제공 할 수 있다면 좋을 것입니다. 그러나 문제를 잘 이해했다면 data.frame은 치수를 줄입니다. 아래에 적어 놓은 예제에 따르면 그것은 일어나서는 안됩니다. 두 번째 기능은 정확합니다. 문제가 없도록 적용하는 방법을 보여줍니다. 희망이 도움이 :

library(tidyverse) 

set.seed(123) 

df <- as.data.frame(matrix(c(0, sample(0:14, size = 14)), ncol = 5)) 

df %>% 
    mutate_all(., ~ ifelse(.!=0, log10(.+0.00000000001), log10(1))) 
0

+1 Rui Barradas의 답변 위의 사용 log1p.

위의 해결 방법은 처음 점수가 0 점인 경우에만 log(x+1)을 반환하고 기타 모든 경우에는 log(x+1e-11)을 반환합니다. 이것은 당신을 제공합니다 :

log4Zero(0) ~= log4Zero(1) 
log4Zero(0) >> log4Zero(1e-10) 

0이 1로 그러나 변환 후보다 1E-10에 더 가까운, 정확히 0 당신의 관찰은 1E-10의 당신의 관찰보다 훨씬 더 많은 것입니다. 나는 이것이 당신이 원하는 것이 아니라는 것을 거의 확신합니다. 내가 log4Zero(df)를 실행하면 길이가 400의 목록이 아닌 데이터 프레임을 반환

df = data.frame(matrix(rnorm(400,5,1), nrow=20)) 
df[1,1] = 0 
df[2,1] = 1e-10 
log1p(df) 

:

일부 더미 데이터를 사용하여. 이는 ifelse()이 이미 벡터화되어 있기 때문입니다. 따라서 전체 데이터 프레임을 전달하면 x이 데이터 프레임의 각 항목이 아니라 각 열이됩니다. c 의한 치수 r의 데이터 프레임으로부터, 각 항목과, 길이 r * c의리스트를 반환하거나 변형 된 열 (log10(x+0.00000000001)) 또는 단일 값 인 (log10(1))

는 사용하는 기능을 적용 할 경우 ifelse() 대신 apply() 사용

logNew = function(x) ifelse(x!=0, log10(x), NA) 
apply(df, 2, logNew)