我有一个函数,如果该值的长度仅为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)
,但这增加了许多新列。
出了什么问题?有更好的方法吗?
答案 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))