使用函数更改每行dataframe列的值

时间:2014-09-25 17:32:55

标签: r dplyr

我有一个函数,如果该值的长度仅为1个字符,则会向值追加“0”:

myFormat <- function(v) {
  if(nchar(v) == 1){
    paste0("0",v)
  }
  else
    as.character(v)
}

我有一个数据框DF,其中一个名为A的列的字符类似于:

A
3
12
5
10
1
...

运行myFormat()后,列A应如下所示:

A
03
12
05
01
...

我尝试过:DF$A <- lapply(DF$A, weekFormat(DF$A))但是我遇到了错误。

我也试过:mutate(DF, newCol = myFormat(A))但在那里得到错误,说只会使用第一个元素。

还尝试了cbind(DF, lapply(DF$A, wmyFormat),但这增加了许多新列。

出了什么问题?有更好的方法吗?

5 个答案:

答案 0 :(得分:5)

使用sprintf可以轻松完成此操作。使用@nrussell的数据

DF$A <- sprintf("%02d", DF$A)
DF$A
#[1] "03" "12" "05" "10" "01"

答案 1 :(得分:1)

您可以使用sapply代替lapply

DF <- data.frame(A=c(3,12,5,10,1))
> DF
   A
1  3
2 12
3  5
4 10
5  1
##
DF$A <- sapply(DF$A, myFormat)
> DF
   A
1 03
2 12
3 05
4 10
5 01

答案 2 :(得分:1)

无需执行此功能。只需使用sprintf。

DF$A<-sprintf("%02d",DF$A)

答案 3 :(得分:1)

您收到该错误,因为if未向量化,并且仅使用第一个元素。 IMO是sprintf最好的答案。但要修正错误,请在您的函数中尝试ifelse

ifelse(nchar(x) == 1, paste0("0", x), x)
# [1] "03" "12" "05" "10" "01"

您还可以在函数中使用向量子集。这样就可以很好地与lapply

一起使用
myFormat <- function(v) {
    w <- which(nchar(v) == 1)
    v[w] <- paste0("0", v[w])   
    v
}
lapply(DF, myFormat)
# $A
# [1] "03" "12" "05" "10" "01"

但是sprintf对你正在做的事情肯定更好。

答案 4 :(得分:0)

我假设weekFormat应该是myFormat,反之亦然。这就是你想要的

DF$A <- unlist(lapply(DF$A, myFormat))