用于对具有列输入的行进行操作的函数

时间:2014-06-19 11:19:00

标签: r

如果我有数据帧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")

如何创建此功能?我最好在这里使用其中一个应用函数吗?

4 个答案:

答案 0 :(得分:4)

你需要逗号:

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

  #return df
  df
}

答案 1 :(得分:2)

假设您的所有列都是character列,您可以执行此操作:

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

如果不能假设所有列都是character列,那么这应该可行:

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

答案 2 :(得分:0)

我会使用apply:

apply(df, c(1, 2), function(x){ifelse(nchar(x)<3, NA, x)})
亲切的问候

答案 3 :(得分:0)

您也可以使用:

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