2013-10-21 25 views
47

Có khung dữ liệu, làm cách nào để thay thế tất cả các giá trị cụ thể dọc theo tất cả các hàng và cột. Nói ví dụ tôi muốn thay thế tất cả hồ sơ trống với NA 's (mà không cần gõ các vị trí):Thay thế tất cả các giá trị cụ thể trong một khung dữ liệu

df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100))) 

    A B 
1  12 
2 xyz  
3 jkl 100 

Kết quả mong đợi:

A B 
1 NA 12 
2 xyz NA 
3 jkl 100 

Trả lời

70

Như thế này:

> df[df==""]<-NA 
> df 
    A B 
1 <NA> 12 
2 xyz <NA> 
3 jkl 100 
+10

là có một cách để làm điều này một cách hiệu quả cho hơn 1 giá trị !? – PikkuKatja

+10

Điều này không có tác dụng đối với các yếu tố, 'df [df ==" xyz "] <-" abc "' sẽ lỗi với "mức yếu tố không hợp lệ". Có giải pháp tổng quát hơn không? – glallen

+0

không hoạt động đối với tôi. Tôi đã thử điều này: dfSmallDiscreteCustomSalary [dfSmallDiscreteCustomSalary $ salary == "<= 50K"] <- "49K". Vẫn còn duy nhất (dfSmallDiscreteCustomSalary $ lương) tôi nhận được: [1]> 50K <= 50K –

19

Kể từ PikkuKatja và glallen yêu cầu một giải pháp tổng quát hơn và tôi không thể bình luận được, tôi sẽ viết một câu trả lời. Bạn có thể kết hợp câu lệnh như trong:

> df[df=="" | df==12] <- NA 
> df 
    A B 
1 <NA> <NA> 
2 xyz <NA> 
3 jkl 100 

Đối với các yếu tố, mã zxzak của đã mang lại yếu tố:

> df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100))) 
> str(df) 
'data.frame': 3 obs. of 2 variables: 
$ A: Factor w/ 3 levels "","jkl","xyz": 1 3 2 
$ B: Factor w/ 3 levels "","100","12": 3 1 2 

Nếu gặp khó khăn, tôi muốn đề nghị tạm thả các yếu tố.

df[] <- lapply(df, as.character) 
2

Chúng tôi có thể sử dụng dữ liệu để có thể nhanh chóng. Đầu tiên tạo df mà không cần yếu tố,

df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F) 

Bây giờ bạn có thể sử dụng

setDT(df) 
for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA) 

và bạn có thể chuyển đổi nó trở lại một data.frame

setDF(df) 

Nếu bạn chỉ muốn sử dụng dữ liệu .frame và giữ yếu tố khó khăn hơn, bạn cần phải làm việc với

levels(df$value)[levels(df$value)==""] <- NA 

trong đó giá trị là tên của mỗi cột. Bạn cần phải chèn nó trong một vòng lặp.

+2

Tại sao bạn sử dụng thư viện bên ngoài cho trường hợp sử dụng này? Tại sao một vòng lặp nếu điều này có thể được giải quyết với một dòng? Câu trả lời của bạn thêm giá trị vượt ra ngoài các câu trả lời đã có? Tôi không có ý định khắc nghiệt, tôi nghĩ rằng tôi đang thiếu một cái gì đó, do đó các câu hỏi. – sedot

+1

Nhanh hơn nhiều đối với các tập dữ liệu lớn. Nó bổ sung thêm một giải pháp thay thế để người dùng có thể chọn lựa tốt nhất cho anh ta. – skan

0

Nếu bạn muốn thay thế nhiều giá trị trong một khung dữ liệu, việc lặp qua tất cả các cột có thể hữu ích.

Giả sử bạn muốn thay thế ""100:

na_codes <- c(100, "") 
for (i in seq_along(df)) { 
    df[[i]][df[[i]] %in% na_codes] <- NA 
} 
Các vấn đề liên quan