2014-06-19 27 views
2

如果我有一個數據幀DF:功能就行操作與列輸入

df <- data.frame(var_1 = c("abcd","abc","ab"), var_2 = c("abcd","abc","ab")) 
df$var_1 <- as.character(df$var_1) 
df$var_2 <- as.character(df$var_2) 

說我想空白VAR_1行這是在3個字符,我通常會做到這一點:

df$var_1 <- ifelse(nchar(df$var_1) < 3,NA,df$var_1) 

現在說我想把它變成一個函數,所以我可以將它應用到任何列。我創建了採用列名作爲輸入的功能:

Func <- function(input_col) { 
    df[input_col] <- ifelse(nchar(df[input_col]) <3,NA,df[input_col]) 
    df 
} 

然而,當我跑這不會產生任何東西:

df <- Func(input_col = "var_1") 

如何創建這個功能呢?在這裏使用其中一種應用功能會更好嗎?

+3

無關你的實際問題,但我要指出你可以通過添加'stringsAsFactors = FALSE'作爲'data.frame()'的一個選項來避免第2行和第3行。 – coffeinjunky

回答

4

您需要逗號:

Func <- function(input_col) { 
    df[,input_col] <- 
    ifelse(nchar(df[,input_col]) <3, 
      NA,df[,input_col]) 

    #return df 
    df 
} 
0

我會使用適用於:

apply(df, c(1, 2), function(x){ifelse(nchar(x)<3, NA, x)}) 

樣的問候

+1

'lapply'在這裏可能會更好,例如'df [] < - lapply(df,function(x)ifelse(nchar(x)<3,NA,x))' –

2

假設所有列character列,你可以這樣做:

df[sapply(df, nchar) < 3] <- NA 

如果這也不行承擔的所有列是character列,這應該工作:

d <- sapply(df, is.character) 
short <- sapply(df[d], nchar) < 3 
df[d][short] <- NA 
+0

謝謝,很高興知道 – Zfunk

0

你也可以使用:

library(plyr) 
is.na(df) <- colwise(nchar)(df) < 3