我刚开始大约一周前。在我的目录中,我有名为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功能。我没有那么远。
答案 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>