R:使用lappy时出现问题

R:使用lappy时出现问题,r,dataframe,R,Dataframe,我有一个数据帧。我想要实现的是将一列(表示月份)编码为2个字符(长度为2的字符串),而不是整数 以下是一些数据示例: wifi <- data.frame(replicate(2,8:12)) 我想要这样的东西: X1 X2 1 8 8 2 9 9 3 10 10 4 11 11 5 12 12 X1 X2 1 8 08 2 9 09 3 10 10 4 11 11 5 12 12 下面是我做的函数: A <

我有一个数据帧。我想要实现的是将一列(表示月份)编码为2个字符(长度为2的字符串),而不是整数

以下是一些数据示例:

wifi <- data.frame(replicate(2,8:12))
我想要这样的东西:

   X1  X2
1   8   8
2   9   9
3  10  10
4  11  11
5  12  12
   X1  X2
1   8  08
2   9  09
3  10  10
4  11  11
5  12  12

下面是我做的函数:

A <- function(x) {
    if(nchar(x)==1) {
        return(paste0("0",x))
    } else {
        return(x)
    }
}
这是我得到的结果,似乎这个函数对所有元素应用了一次,而不是对每个元素

   X1   X2
1   8   08
2   9   09
3  10  010
4  11  011
5  12  012
警告信息: 在if(nchar(x)==1){ 条件的长度大于1,并且只使用第一个元素


有人知道我可以解决这个问题吗?

你应该改用sprintf函数

这将应用于所有列:

sapply(wifi, function(x) sprintf("%02.0f", x))
这仅适用于第二个:

sprintf("%02.0f", wifi$X2)
sprintf
是一个内置函数,用于格式化字符串(与C中的相同),它完全按照
a
函数的要求执行


最好对数据帧使用
sapply

我会使用
sprintf()解决它

但是,最好使用向量化的
ifelse()
并删除
*apply()


A非常感谢您的回答,我以前看过这个ifelse,但现在感谢您,我知道它的用途了:)
sprintf("%02.0f", wifi$X2)
A <- function(x) {
  sprintf("%02d", x)
}

wifi[[2]] <- A(wifi[[2]])
wifi
  X1 X2
1  8 08
2  9 09
3 10 10
4 11 11
5 12 12
sapply(wifi[[2]], A) 
A <- function(x) {
  x <- as.character(x)
  ifelse(nchar(x) == 1, paste0("0", x), x)
}