使用冒号指定函数中的序列

时间:2014-05-13 05:28:41

标签: r

我刚开始大约一周前。在我的目录中,我有名为001,002,... 010,... 331的csv文件。在下面的部分功能中,要求用户输入id(例如1:9)。然后将id转换为001,002,003,... 009。但是,如果用户输入id为1:10的id,则该函数将输出id [10] as" 0010"而不是" 010"。这导致我的其余功能失败。有关可能发生的事情的任何建议?如果我输入1:10,我想获得001,002,003,004,005,006,007,008,009和 010

pollutantmean <- function(directory, pollutant, id) {

    if((id>=1) && (id<10)) {
            fn <- paste("00",id,sep="")
            print(fn)
    } else if((id>=10) && (id<=99)) {
            fn <- paste("0",id,sep="")
            print(fn)
    } else {
            fn <- id
            print(fn)
    }

请不要为此使用R apply功能。我没有那么远。

3 个答案:

答案 0 :(得分:3)

这会将前导&#34; 0&#34;的宽度设为3个字符,并将数值视为咒语。

sprintf("%03s", 1:10)
 [1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010"

答案 1 :(得分:2)

问题在于您使用if语句和短路&&运算符。在这种情况下,&&只会查看向量id的第一个元素并在那里做出决定。在这种情况下(1>=1) && (1<10)所以它执行第一个块。然后你调用fn <- paste("00",id,sep=""),它被矢量化,因此它对整个id向量进行操作,因此它为每个元素添加'00'。你似乎正在处理函数,就像有一些隐式循环,但没有。

当然@thelastemail对fn <- sprintf("%03d",id)的建议在这种情况下是正确的,但只是为了讨论,你的代码可以重写为

fn <- paste(ifelse(id<10, "00", ifelse(id<100, "0", "")),id,sep="")

因为ifelse确实有一种隐含的循环,因为它可以对向量中的每个元素做出不同的决定。

答案 2 :(得分:2)

您的功能很接近,但它只评估一个号码id。我添加了一个for循环来处理一系列数字:

pollutantmean <- function(idrange) {
  for(id in idrange){
  if((id>=1) && (id<10)) {
    fn <- paste("00",id,sep="")
    print(fn)
  } else if((id>=10) && (id<=99)) {
    fn <- paste("0",id,sep="")
    print(fn)
  } else {
    fn <- id
    print(fn)
  }}
}

我删除了目录和污染物参数,但它们可以很容易地重新添加。此函数将评估感兴趣范围内的所有数字并将其打印出来:

R> pollutantmean(1:10)
[1] "001"
[1] "002"
[1] "003"
[1] "004"
[1] "005"
[1] "006"
[1] "007"
[1] "008"
[1] "009"
[1] "010"
R>