2017-03-29 3 views
1

숫자가 아닌 값을 가진 모든 셀을 누락 된 데이터 (NA)로 변환하려고합니다. 특정 값을 다음과 같이 누락 된 데이터로 변환하는 과정에서 비슷한 것을 시도했습니다.데이터 프레임의 모든 숫자가 아닌 셀을 NA로 변환하는 방법

recode_missing <- function (g, misval) 
{ 
    a <- g == misval 
    temp = g 
    temp [a] <- NA 
    return (temp) 
} 

정말 멋지다 : 우아한 R 솔루션.

난 (구문 잘못) a <- g == is.numeric(), a <- is.numeric (g): (Error: (list) object cannot be coerced to type 'double'), or even처럼 디코딩하도록 시도한 [] < - is.numeric (g [] '(동일한) I 제거 열 용액의 인식

remove_nn <- function (data) 
{ 
    # removes all non-numeric columns 
    numeric_columns <- sapply (data, is.numeric) 
    return (data [, numeric_columns]) 
} ### remove_nn ### 
.

하지만 그 열을 제거하고 약간의 행렬에 데이터 프레임으로 변환합니다.

누군가가 그대로 데이터 구조를 유지하면서 NA에 단일 숫자가 아닌 세포를 변환하는 방법에 대한 조언을 주시겠습니까?

편집

주석이 올바르게 지적했듯이 숫자 값의 바다에는 개별 문자열 값 같은 것이 없습니다. 숫자이거나 다른 것 인 벡터. medians <- apply (data, 2, median)에서 숫자가 아닌 오류의 원인을 알고 싶었습니다. 나는 많은 벡터들을 가지고 있고 눈으로 검사하는 것은 쓸데없는 것으로 판명되었습니다. 나는 num <- sapply (data, is.numeric)와 다음 data [,!num]을 발행했다. 그건 나에게 숫자가 아닌 칼럼을 주었다. 하나가 불필요한 셀 값으로 인해 발생한 경우. 파일이 스프레드 시트로 사전 처리되고 하나의 셀이 숫자가 아닌 경우 전체 벡터는 숫자가 아닌 것으로 간주됩니다.

+4

열의 값은 독립적으로 숫자가 될 수 없습니다. 열이 숫자이거나 그렇지 않습니다. 예제를 제공해 줄 수 있습니까? – Hugh

+2

'lapply (data, function (i) as.numeric (as.character (i)))'와 같은 것을 시도 했습니까? – Sotos

+2

당신이'mydf [] <- lapply (mydf, as.numeric)'와 같은 것을 원한다고 생각합니다 - @Sotos가 나를 때려 눕힌다 ;-) – A5C1D2H2I1M1N2O1R2T1

답변

2

기준 귀하의 편집에 숫자가되어야하는 벡터가 있지만, 판독 과정 중에 잘못된 데이터가 입력되어 데이터가 다른 형식 (가능성이 character 또는)으로 변환되었습니다.

다음은 그 예입니다 예를 들어, mydf1 <- mydf2 <- mydf3 <- data.frame(...)은 같은 데이터로 3 개의 data.frame을 생성합니다.

# I'm going to show three approaches 
mydf1 <- mydf2 <- mydf3 <- data.frame(
    A = c(1, 2, "x", 4), 
    B = c("y", 3, 4, "-") 
) 

str(mydf1) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: Factor w/ 4 levels "1","2","4","x": 1 2 4 3 
# $ B: Factor w/ 4 levels "-","3","4","y": 4 2 3 1 
012 이 작업을 수행하는 3,516,

한 가지 방법은 R이 NA에 숫자로 변환 할 수없는 값을 강요하도록하는 것입니다 :

## You WILL get warnings 
mydf1[] <- lapply(mydf1, function(x) as.numeric(as.character(x))) 
# Warning messages: 
# 1: In FUN(X[[i]], ...) : NAs introduced by coercion 
# 2: In FUN(X[[i]], ...) : NAs introduced by coercion 

str(mydf1) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: num 1 2 NA 4 
# $ B: num NA 3 4 NA 

또 다른 옵션을 사용하는 것입니다 makemeNAmy SOfun package에서 :

library(SOfun) 
makemeNA(mydf2, "[^0-9]", FALSE) 
# A B 
# 1 1 NA 
# 2 2 3 
# 3 NA 4 
# 4 4 NA 

str(.Last.value) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: int 1 2 NA 4 
# $ B: int NA 3 4 NA 

이 기능 변환을 수행하는 데있어서 type.convert을 사용한다는 점에서 조금 다르며 데이터를 읽을 때 na.strings에 대한 벡터를 사용할 수있는 것처럼 더 구체적인 변환 규칙을 NA에 처리 할 수 ​​있습니다. nto R). 당신의 오류에 대한


, 나는 당신이 표시 한 오류를 얻을 수 있도록 data.frameas.numeric을 시도했을 믿습니다.

예 :

# Your error... 
as.numeric(mydf3) 
# Error: (list) object cannot be coerced to type 'double' 

당신은 (하지만 여전히 경고를 얻을 수 있습니다) ... 비록 matrix에 그 오류를받지 않습니다

# You'll get a warning 
as.numeric(as.matrix(mydf3)) 
# [1] 1 2 NA 4 NA 3 4 NA 
# Warning message: 
# NAs introduced by coercion 

왜 우리하지 명시 적으로 as.character을 사용해야합니까? as.matrix이 귀하를 대신합니다 :

str(as.matrix(mydf3)) 
# chr [1:4, 1:2] "1" "2" "x" "4" "y" "3" "4" "-" 
# - attr(*, "dimnames")=List of 2 
# ..$ : NULL 
# ..$ : chr [1:2] "A" "B" 

어떻게 정보를 얻을 수 있습니까?

mydf3[] <- as.numeric(as.matrix(mydf3)) 
# Warning message: 
# NAs introduced by coercion 

str(mydf3) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: num 1 2 NA 4 
# $ B: num NA 3 4 NA 
+0

내 질문의 배경에 답변 해 주셔서 감사합니다. 나는 어떤 시점에서 강요 오류를 얻었고 이제는 그들이 의미하는 바를 알고있다. 누락 된 데이터는 엉덩이에 통증이 있으며 적어도 기본적인 이해를 얻으려면 적어도 하루가 걸렸습니다. 이 추가 답변과 같은 추가 설명이 도움이됩니다. – Arnold

+0

@Arnold, 오케이. 희망적으로 도움이되는 정보를 추가했습니다. – A5C1D2H2I1M1N2O1R2T1

+0

@ A5C1D2H2I1M1N2O1R2T1 그것은 매우 관대합니다. 이미 제안 사항 중 일부를 적용했으며 실제로 도움이되었습니다. 대단히 감사합니다 !! – Arnold