2017-01-22 7 views
0

Hmisc 전가 모델로 데이터 프레임을 대체하려고합니다. 한 번에 한 열에 대한 데이터를 전가 할 수 있지만 열을 반복 할 수는 없습니다.R에있는 데이터를 대체하기 위해 각 열을 루핑하지만 귀가 된 데이터를 대체하지 않습니다.

예를 아래

은 - 잘 작동하지만 함수를 사용하여 동적으로 만들 싶습니다 :

impute_marks$col1 <- with(impute_marks, round(impute(col1, mean)),0) 

예 : 나는이 기능을 실행하지하지만이있을 때

impute_dataframe <- function() 
{ 
    for(i in 1:ncol(impute_marks)) 
    { 
    impute_marks[is.na(impute_marks[,i]), i] <- with(impute_marks, round(impute(impute_marks[,i], mean)),0) 
    } 
} 
impute_dataframe 

가 오류가 없습니다 귀속 된 데이터뿐만 아니라 데이터 세트 impute_marks. 이처럼 다시 coherce 수있는 data.frame으로 mydf을 유지하기 위해 :

답변

1

Hmisc::impute

함수가, 왜 그냥 apply을 사용하고 for 루프?

library(Hmisc) 
age1 <- c(1,2,NA,4) 
age2 <- c(NA, 4, 3, 1) 
mydf <- data.frame(age1, age2) 

mydf 
    age1 age2 
1 1 NA 
2 2 4 
3 NA 3 
4 4 1 

apply(mydf, 2, function(x) {round(impute(x, mean))}) 
    age1 age2 
1 1 3 
2 2 4 
3 2 3 
4 4 1 

편집을 저장 이미

mydf <- as.data.frame(mydf) 

하지만 내가 할 수있는 것은이 적용/매핑 아이디어를 다루는 유용한 도구 인 purrr이라는 다른 패키지를 사용하는 것입니다. 예를 들어 map_df 항상 나는 기본 R 기능을 사용하는 것이 바람직하다 알고 당신이 ?map

library(purrr) 
map_df(mydf, ~ round(impute(., mean))) 

로 볼 수 있습니다 map_x의 무리가하는 data.frame 객체를 반환하지만 purrr는 너무 쉽게 apply 스타일의 작업을한다 .

+1

저는 R에 상당히 익숙합니다. 적용 기능을 잘 몰랐습니다. 그것을 지적 주셔서 감사합니다. 내가 원하는 것을 얻을 수 있었지만 작업이 끝나면 데이터 프레임보다는 매트릭스를 얻습니다. 데이터를 입력 한 후에 데이터 프레임으로 변환하려면 어떻게해야합니까? 이것은 내가 가진 것입니다 : num [1 : 153, 1:26] 55 68 .... 모든 값. 153 obs보다는 오히려. 26 variables –

+0

당신이이 일을 많이하는 것을 발견하면 as.data.frame() –

+0

을 사용하여 전체 오른쪽을 래핑하여 해결할 수 있습니다.'library (purrr) '를 보면 멋진 문법을 가지고 있으며 더 직관적이라고 생각합니다. 'apply','lapply' 등의 함수보다 – Nate

1

우리는 기본적으로 lapply

mydf[] <- lapply(mydf, function(x) round(na.aggregate(x))) 

과 별도로 데이터 세트

library(zoo) 
round(na.aggregate(mydf)) 
# age1 age2 
#1 1 3 
#2 2 4 
#3 2 3 
#4 4 1 

또는 각 열에 직접 적용 할 수 zoo에서 na.aggregatena.aggregatemean 제공 할 수 있습니다. 그러나 우리는 변경할 수 있습니다 FUN