我有一个看起来像这样的数据框。
df <- data.frame(Var1=c(1:10))
Var1
1
2
3
4
5
6
7
8
9
10
我想将上面的数据框转换为范围标签,例如:&#34; 1及以下&#34;,&#34; 1到2&#34;,&#34; 3到4&#34 ;依此类推,直到&#34; 10及以上&#34;。所以我在下面创建了这个循环:
rangelist <- function(i){
start=paste( df$Var1[1],"and below")
middle=paste( df$Var1[i+1],"to", df$Var1[i+2])
last=paste(df$Var1[nrow(df)],"and above")
paste(start)
paste(middle)
paste(last)
}
sapply(1:nrow(df),rangelist)
但上面的循环让我回答:
[1] "10 and above" "10 and above" "10 and above" "10 and above" "10 and above" "10 and above"
[7] "10 and above" "10 and above" "10 and above" "10 and above"
答案 0 :(得分:1)
尝试
indx <- df$Var1[-c(1, nrow(df))]
df$label <- c('1 and below', paste(indx-1, indx, sep=' to '), '10 and above')
df$label
#[1] "1 and below" "1 to 2" "2 to 3" "3 to 4" "4 to 5"
#[6] "5 to 6" "6 to 7" "7 to 8" "8 to 9" "10 and above"
更通用的是
indx <- setdiff(1:nrow(df), c(1, nrow(df)))
with(df, c(paste(Var1[1], 'and below'), sprintf('%s to %s', Var1[indx-1],
Var1[indx]), paste(Var1[nrow(df)], 'and above')))
#[1] "1 and below" "1 to 2" "2 to 3" "3 to 4" "4 to 5"
#[6] "5 to 6" "6 to 7" "7 to 8" "8 to 9" "10 and above"