我正在嘗試創建一個非常基本的函式,在該函式中,我想根據 df 中的特定列從 df 中洗掉任何 0 值(或更少)。當我在函式之外運行這些行時,它們可以作業,但是當我嘗試在函式內運行它們時,我收到此錯誤“ $<-.data.frame( *tmp*, name, value = numeric(0)) 中的錯誤:替換有 0 行”。有誰知道問題是什么?
Remove_Missing=function(x,name){
x$name=as.numeric(x$name)
x=x[x$name>0,]
}
編輯:
示例代碼:
#First two lines work but those same two lines won't work if function is called
merged_data$name=as.numeric(merged_data$HETENURE)
merged_data=merged_data[merged_data$HETENURE>0,]
Remove_Missing(merged_data, HETENURE) #Call function
資料
structure(list(HRHHID = c("008906910993941", "008906910993941",
"648061954059610", "160916068405549", "160916068405549", "168069009100998"
), HRYEAR4 = c("2010", "2010", "2010", "2010", "2010", "2010"
), HETENURE = c(" 1", " 1", " 3", " 1", " 1", " 1"), HEFAMINC = c("11",
"11", "10", "13", "13", "14"), HRNUMHOU = c(" 2", " 2", " 1",
" 2", " 2", " 3"), GESTFIPS = c("01", "01", "01", "01", "01",
"01"), GTMETSTA = c("2", "2", "1", "1", "1", "1"), PEMARITL = c(" 1",
" 1", " 4", " 1", " 1", " 1"), PESEX = c(" 2", " 1", " 1", " 2",
" 1", " 2"), PEEDUCA = c("40", "45", "40", "42", "41", "39"),
PTDTRACE = c(" 1", " 1", " 1", " 1", " 1", " 1"), PEHSPNON = c(" 2",
" 2", " 2", " 2", " 2", " 2"), PEMLR = c(" 5", " 5", " 5",
" 1", " 1", " 7"), PRFTLF = c("-1", "-1", "-1", " 1", " 1",
"-1"), PRHRUSL = c("-1", "-1", "-1", " 4", " 4", "-1"), HESP1 = c("-1",
"-1", "-1", "-1", "-1", "-1"), HESP6 = c("-1", "-1", "-1",
"-1", "-1", "-1"), HESP7A = c("-1", "-1", "-1", "-1", "-1",
"-1"), HESP8 = c("-1", "-1", "-1", "-1", "-1", "-1"), HRFS12M1 = c(" 1", " 1", " 1", " 1", " 1", " 1")), row.names = c(9L, 10L, 11L,
12L, 13L, 15L), class = "data.frame")
uj5u.com熱心網友回復:
這里有兩個問題和一個啟用錯誤:
您定義了您的函式,
function(x, name)然后嘗試將特定列參考為x$name,這應該會失敗。也就是說,如果name應該識別(通過標準評估)一列,那么它應該真的是一個字串,并且$不能那樣作業。您應該改為使用x[[name]](請參閱括號 [ ] 和雙括號 [[ ]] 之間的區別,用于訪問串列或資料框的元素)。然而,由于接下來的兩個錯誤,這并沒有報告為問題(盡管它應該)。
您將您的功能稱為
Remove_Missing(merged_data, HETENURE)但是由于您沒有嘗試進行非標準評估(NSE),因此使用
HETENURE是錯誤的。應該發生的是,在你的函式中,當它name被參考時,它應該尋找一個命名的物件HETENURE而不是找到它;它應該與Error: object 'HETENURE' not found. 我認為你應該做的是Remove_Missing(merged_data, "HETENURE")與其說是一個錯誤,不如說是一個允許其他錯誤未被發現的弱點:您分配了
merged_data$name <- as.numeric(...),因此在您的函式中,當x$name應該參考x$HETENURE并且應該失敗時,它反而找到了name在您的資料中命名的列(因此函式傳遞的引數為name從未被參考/使用)。
首先,讓我們洗掉名為 的列的誘人隱藏錯誤name:
merged_data$name <- NULL
二、固定功能:
Remove_Missing = function(x, name) {
x[[name]] = as.numeric(x[[name]])
x[x[[name]] > 0,]
}
第三,修復呼叫并獲取回傳資料:
Remove_Missing(merged_data, "HETENURE")
# HRHHID HRYEAR4 HETENURE HEFAMINC HRNUMHOU GESTFIPS GTMETSTA PEMARITL PESEX PEEDUCA PTDTRACE PEHSPNON PEMLR PRFTLF PRHRUSL HESP1 HESP6 HESP7A HESP8 HRFS12M1 name
# 9 008906910993941 2010 1 11 2 01 2 1 2 40 1 2 5 -1 -1 -1 -1 -1 -1 1 1
# 10 008906910993941 2010 1 11 2 01 2 1 1 45 1 2 5 -1 -1 -1 -1 -1 -1 1 1
# 11 648061954059610 2010 3 10 1 01 1 4 1 40 1 2 5 -1 -1 -1 -1 -1 -1 1 3
# 12 160916068405549 2010 1 13 2 01 1 1 2 42 1 2 1 1 4 -1 -1 -1 -1 1 1
# 13 160916068405549 2010 1 13 2 01 1 1 1 41 1 2 1 1 4 -1 -1 -1 -1 1 1
# 15 168069009100998 2010 1 14 3 01 1 1 2 39 1 2 7 -1 -1 -1 -1 -1 -1 1 1
當然,在這種情況下,沒有過濾掉任何內容(因為您的所有資料都通過了條件),所以如果我暫時修改函式以使用條件> 1,我們將看到更改:
Remove_Missing = function(x, name) {
x[[name]] = as.numeric(x[[name]])
x[x[[name]] > 1,]
}
Remove_Missing(merged_data, "HETENURE")
# HRHHID HRYEAR4 HETENURE HEFAMINC HRNUMHOU GESTFIPS GTMETSTA PEMARITL PESEX PEEDUCA PTDTRACE PEHSPNON PEMLR PRFTLF PRHRUSL HESP1 HESP6 HESP7A HESP8 HRFS12M1 name
# 11 648061954059610 2010 3 10 1 01 1 4 1 40 1 2 5 -1 -1 -1 -1 -1 -1 1 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/358032.html
上一篇:C 函式內函式
下一篇:在函式之間傳遞串列
