2014-09-04 69 views
1

我有一個數據框df。對於每一列,我想通過寫入TRUE(= outlier)或FALSE(= no outlier)來添加另一列,指示該值是在我的簡單「異常值檢測閾值」之內還是之外。在數據框中爲每個現有數據框添加一個新列(用於異常值檢測)

下面的代碼:

df <- read.csv("<FILE>", header=TRUE, sep=";") 
column_names <- colnames(df[,-1]) # first column is actually row name 

for(name in column_names) { 
    med <- median(df[[name]], na.rm = TRUE) 
    std <- sd(df[[name]], na.rm = TRUE) 
    max <- med + 3 * std 
    min <- med - 3 * std 

    newcol <- paste(name, "outlier", sep="_") # create new column name 
    df <- within(df, newcol <- ifelse(name < max & name > min,"FALSE","TRUE")) 
} 

而不是對每個現有添加新列,剛剛入選一列「NEWCOL」被添加。在這種情況下,如何訪問變量newcol的實際值? Alread試圖得到(newcol)和[[newcol]]。

非常感謝您的幫助!

編輯: 解決方案看起來像這樣

df <- read.csv("<FILE>", header=TRUE, sep=";") 
column_names <- colnames(df[,-1]) # first column is actually row name 
for(name in column_names) { 
    med <- median(df[[name]], na.rm = TRUE) 
    std <- sd(df[[name]], na.rm = TRUE) 
    max <- med + 3 * std 
    min <- med - 3 * std 

    newcol <- paste(name, "outlier", sep="_") 
    df[[newcol]] <- with(df, ifelse(df[[name]] < max & df[[name]] > min,"FALSE","TRUE")) 
} 

回答

1

你的最後一行應讀的方法:

df[[newcol]] <- with(df, ifelse(...)) 

<-操作假定newcol是列的實際名稱,而不是包含此名稱的變量。

+0

對不起,想通了。在我最初的問題中添加了解決方案。 感謝您的幫助! – chrmar 2014-09-04 10:27:45

+0

@chrmar您不應編輯問題以包含答案。如果您有不同的答案,請將其作爲解決方案發布,以便社區可以爲無法應付此問題的未來用戶高舉/低投票。 – MrFlick 2014-09-04 13:49:49

1

這是使用data.table

require(data.table) 

outlier <- function(x) { 
    med <- median(x, na.rm = TRUE) 
    std <- sd(x, na.rm = TRUE) 
    max <- med + 3 * std 
    min <- med - 3 * std 
    return(!(x < max & x > min)) 
} 

# df <- fread("<FILE>") 
df <- data.table(x = rt(10, 5), y = rt(10, 5)) 
df[3, x := 100] 
df[7, y := 100] 

df[, paste(names(df), "outlier", sep="_") := lapply(.SD, outlier)] 
df 
0

你可以在一次分配的一切:

is_outlier <- function(x) { 
    med <- median(x, na.rm = TRUE) 
    std <- sd(x, na.rm = TRUE) 
    max <- med + 3 * std 
    min <- med - 3 * std 
    !(x < max & x > min) 
} 

column_names <- names(df)[-1] 
column_names_outlier <- paste(column_names, "outlier", sep="_") 
df[column_names_outlier] <- lapply(df[column_names], is_outlier) 
相關問題