Tôi thường xuyên có các tình huống mà tôi cần phải thay thế các giá trị bị thiếu từ một data.frame bằng các giá trị từ một số tệp dữ liệu khác. . Vì vậy, ví dụ, nếu tôi có một data.frame đầy đủ dữ liệu của quận tôi có thể thay thế các giá trị NA với các giá trị trạng thái được lưu trữ trong một data.frame khác. Sau khi viết cùng một số merge
... ifelse(is.na())
yada yada vài chục lần, tôi quyết định chia nhỏ và viết một hàm để thực hiện việc này.Tạo hàm để thay thế NA từ một data.frame bằng các giá trị từ một số khác
Đây là những gì tôi nấu chín lên, cùng với một ví dụ về cách tôi sử dụng nó:
fillNaDf <- function(naDf, fillDf, mergeCols, fillCols){
mergedDf <- merge(naDf, fillDf, by=mergeCols)
for (col in fillCols){
colWithNas <- mergedDf[[paste(col, "x", sep=".")]]
colWithOutNas <- mergedDf[[paste(col, "y", sep=".")]]
k <- which(is.na(colWithNas))
colWithNas[k] <- colWithOutNas[k]
mergedDf[col] <- colWithNas
mergedDf[[paste(col, "x", sep=".")]] <- NULL
mergedDf[[paste(col, "y", sep=".")]] <- NULL
}
return(mergedDf)
}
## test case
fillDf <- data.frame(a = c(1,2,1,2), b = c(3,3,4,4) ,f = c(100,200, 300, 400), g = c(11, 12, 13, 14))
naDf <- data.frame(a = sample(c(1,2), 100, rep=TRUE), b = sample(c(3,4), 100, rep=TRUE), f = sample(c(0,NA), 100, rep=TRUE), g = sample(c(0,NA), 200, rep=TRUE))
fillNaDf(naDf, fillDf, mergeCols=c("a","b"), fillCols=c("f","g"))
Vì vậy, sau khi tôi đã chạy này tôi đã có cảm giác kỳ lạ này mà ai đó đã có thể giải quyết vấn đề này trước khi tôi và trong một nhiều cách thanh lịch hơn. Có một giải pháp tốt hơn/dễ dàng hơn/nhanh hơn cho vấn đề này không? Ngoài ra, có cách nào giúp loại bỏ vòng lặp ở giữa chức năng của tôi không? Vòng lặp đó là có bởi vì tôi thường thay thế NA trong nhiều hơn một cột. Và, vâng, hàm này giả định các cột mà chúng tôi đang điền từ được đặt tên giống nhau và các cột chúng tôi đang điền đến và điều tương tự cũng áp dụng cho hợp nhất.
Bất kỳ hướng dẫn hoặc tái cấu trúc nào đều hữu ích.
CHỈNH SỬA vào ngày 2 tháng 12 Tôi nhận ra mình có lỗi trong ví dụ mà tôi đã khắc phục.
mát. Một số bình luận có thể giúp tôi hiểu về nó. Nó trông ngắn gọn! :) –
OK - Tôi đã nhận xét một chút. Nếu bạn quan tâm đến việc tìm hiểu thêm, phần 'Ví dụ' của '? Data.table' là một ví dụ điển hình, và cũng đáng giá ~ 20 phút để làm việc. Đặc biệt nếu bạn là một gã dữ liệu lớn - và có vẻ như bạn có thể - nó thực sự đáng để đầu tư thời gian lên phía trước. –
Cảm ơn Josh.Điều đó thực sự hữu ích. –