2013-08-24 3 views
1

27 개의 변수가있는 거의 186,000 행의 큰 데이터 프레임이 있습니다. 특정 변수 "가격"에는 몇 가지 잘못된 값이 있습니다. 분석 결과가이 값을 무시하고 다른 값이 잘 될 수 있도록 잘못된 값을 NA로 설정해야합니다.큰 데이터 프레임 열의 특정 요소를 NA로 설정하는 것은 데이터 프레임의 모든 열을 NA로 설정하는 것입니다.

아래와 같이 문제를 단순화했습니다. 출력도 참조 용으로 주어진다.

dfCSV = structure(list(isin = structure(c(115L, 68L, 100L, 98L, 67L, 
78L, 81L), .Label = c("IN0019780025", "IN0019780074", "IN0019790024", 
"IN0019800021", "IN0019810020", "IN0019820037", "IN0019820128", 
"IN0019830010", "IN0019830143", "IN0019840035", "IN0019840084", 
"IN0019850034", "IN0019850059", "IN0019860033", "IN0019870073", 
"IN0019880031", "IN0019890030", "IN0019900045", "IN0019910036", 
"IN0019910044", "IN0019910127", "IN0019910192", "IN0019950164", 
"IN0019960056", "IN0019960098", "IN0019970014", "IN0019970121", 
"IN0019980021", "IN0019980047", "IN0019980062", "IN0019980096", 
"IN0019980120", "IN0019980153", "IN0019980187", "IN0019980229", 
"IN0019980286", "IN0019980336", "IN0019980344", "IN0019990012", 
"IN0019990038", "IN0019990129", "IN0019990137", "IN0020000025", 
"IN0020000033", "IN0020000041", "IN0020000066", "IN0020000074", 
"IN0020000082", "IN0020000090", "IN0020000108", "IN0020000116", 
"IN0020000124", "IN0020000132", "IN0020010016", "IN0020010024", 
"IN0020010032", "IN0020010040", "IN0020010057", "IN0020010065", 
"IN0020010073", "IN0020010081", "IN0020010099", "IN0020010107", 
"IN0020020015", "IN0020020023", "IN0020020031", "IN0020020049", 
"IN0020020056", "IN0020020064", "IN0020020072", "IN0020020080", 
"IN0020020098", "IN0020020106", "IN0020020122", "IN0020020130", 
"IN0020020155", "IN0020020163", "IN0020020171", "IN0020020213", 
"IN0020020221", "IN0020020247", "IN0020030014", "IN0020030022", 
"IN0020030030", "IN0020030048", "IN0020030055", "IN0020030063", 
"IN0020030097", "IN0020039015", "IN0020039031", "IN0020040013", 
"IN0020040039", "IN0020050012", "IN0020060037", "IN0020060045", 
"IN0020060078", "IN0020060086", "IN0020060219", "IN0020060318", 
"IN0020070010", "IN0020070028", "IN0020070036", "IN0020070044", 
"IN0020070051", "IN0020070069", "IN0020070077", "IN0020080019", 
"IN0020080043", "IN0020080050", "IN0020080068", "IN0020090018", 
"IN0020090026", "IN0020090034", "IN0020090042", "IN0020090059", 
"IN0020090067", "IN0020100015", "IN0020100023", "IN0020100031", 
"IN0020110014", "IN0020110022", "IN0020110030", "IN0020110048", 
"IN0020110055", "IN0020110063", "IN0020110071", "IN0020120013", 
"IN0020120021", "IN0020120039", "IN0020120047", "IN0020120054", 
"IN0020120062"), class = "factor"), tr_date = structure(c(14673, 
13272, 13731, 13515, 13578, 14705, 14155), class = "Date"), ytm = c(40.4806, 
85.041, 80.1207, 75.1705, 82.2098, 70.2422, 10.3402), price = c(25, 
10, 10, 10.19, 9.535, 9.18, 64)), .Names = c("isin", "tr_date", 
"ytm", "price"), row.names = c(11358L, 25878L, 29827L, 43679L, 
75310L, 124470L, 156240L), class = "data.frame") 

다음 라인은 처음 6 개 행의 가격이 올바르지 않은 경우 정확한 출력을 생성한다.

> dfCSV[dfCSV$price < 66, c("isin", "tr_date", "ytm", "price")] 
       isin tr_date  ytm price 
11358 IN0020090059 2010-03-05 40.4806 25.000 
25878 IN0020020056 2006-05-04 85.0410 10.000 
29827 IN0020070010 2007-08-06 80.1207 10.000 
43679 IN0020060219 2007-01-02 75.1705 10.190 
75310 IN0020020049 2007-03-06 82.2098 9.535 
124470 IN0020020171 2010-04-06 70.2422 9.180 
156240 IN0020020247 2008-10-03 10.3402 64.000 

-1로 잘못된 가격을 설정, 그리고 출력은

> dfCSV$price[dfCSV$price < 50] = -1 
> dfCSV[dfCSV$price < 66, c("isin", "tr_date", "ytm", "price")] 
       isin tr_date  ytm price 
11358 IN0020090059 2010-03-05 40.4806 -1 
25878 IN0020020056 2006-05-04 85.0410 -1 
29827 IN0020070010 2007-08-06 80.1207 -1 
43679 IN0020060219 2007-01-02 75.1705 -1 
75310 IN0020020049 2007-03-06 82.2098 -1 
124470 IN0020020171 2010-04-06 70.2422 -1 
156240 IN0020020247 2008-10-03 10.3402 64 

이제 잘못된 가격 (-1이 경우가) NA로 설정하고 지옥 나누기 느슨한대로 예상된다.

> dfCSV$price[dfCSV$price == -1] = NA 
> dfCSV[dfCSV$price < 66, c("isin", "tr_date", "ytm", "price")] 
       isin tr_date  ytm price 
NA    <NA>  <NA>  NA NA 
NA.1   <NA>  <NA>  NA NA 
NA.2   <NA>  <NA>  NA NA 
NA.3   <NA>  <NA>  NA NA 
NA.4   <NA>  <NA>  NA NA 
NA.5   <NA>  <NA>  NA NA 
156240 IN0020020247 2008-10-03 10.3402 64 

내 질문에 내가 NA로 가격대를 만드는 대신 행을 사라지게 만드는 잘못된 여기 무엇입니까?

나는 lapply의 사용을 권장하는 많은 게시물을 보았습니다. 필자의 경우, 주어진 변수에서 일부 가격 만 변경해야합니다. R에서 이것을 처리하는 것은 다소 까다로울 것이고 R-ish가 아닐 것입니다. 나는 거기에 우아한 해결책이 있다고 확신한다. 이것은 R의 더 많은 것을 배울 수있는 좋은 방법이 될 것입니다.

이 문제를 도와주세요. 당신은 결과가 NA하지 TRUE 또는 FALSE입니다 NA와 비교하면 관련

키 쇼어

답변

2

. 그것은 당신의 부분 집합을 엉망으로 만듭니다. dfCSV$price < 66 | is.na(dfCSV$price)을 사용할 수 있습니다 (NA | TRUETRUE을 반환합니다). 당신이 is.na (가격) '으로 행을하지 않은 경우

dfCSV[dfCSV$price < 66 | is.na(dfCSV$price), c("isin", "tr_date", "ytm", "price")] 
#    isin tr_date  ytm price 
# 11358 IN0020090059 2010-03-05 40.4806 NA 
# 25878 IN0020020056 2006-05-04 85.0410 NA 
# 29827 IN0020070010 2007-08-06 80.1207 NA 
# 43679 IN0020060219 2007-01-02 75.1705 NA 
# 75310 IN0020020049 2007-03-06 82.2098 NA 
# 124470 IN0020020171 2010-04-06 70.2422 NA 
# 156240 IN0020020247 2008-10-03 10.3402 64 
+0

그리고'당신은 사용하는 것이'& is.na (CSV $의 가격)'보다는'|!의 is.na (CSV $ 가격)', NA & FALSE 때문에 [1] FALSE를 반환합니다 –

+0

내가 올바른 대답을 이해하면 잘못된 가격이 적절하게 NA로 설정되었지만 행을 선택하는 조건 (가격 <66)이 행 집합을 제대로 선택하지 않았습니다. NA 처리가 "price <66"조건에서 시작해야하는 행을 선택해서는 안된다는 경고가있는 SQL에서 NULL 처리와 유사하다고 말할 수 있습니다. 여기에 뭔가 빠졌습니까 – kishore

+0

그렇습니다. 가격이 'NA'로 설정되었지만 'NA <66'이 (가) 'NA'를 반환하고 'TRUE'또는 'FALSE'대신 'NA'를 사용하여 data.frame 행을 부분 집합하면 행 의 NA. – Roland

관련 문제