我从一个有10行的数据框开始,基于某些条件,我填充了一列。到那时,我到达循环的末尾,我看到我的数据框中有更多的行。
请参阅下面的代码进行复制。
col1 = c(1,1,1,1,1,1,1,1,1,1)
col2 = c(2,2,2,2,2,2,2,2,2,2)
df = data.frame(col1,col2)
bucket = c(2,4,6,8,10)
cat(paste("Number of rows at start == ",nrow(df)))
df$newcol = NULL
for(i in 1:5)
{
if(i == 1)
{
df[1:bucket[1],"newcol"] = "val1"
cat(paste("from 1 to",bucket[1],"\n"))
}else
{
df[bucket[i-1]+1:bucket[i],"newcol"] = paste0("val",i)
cat(paste("from ",bucket[i-1]+1,"to",bucket[i],"\n"))
}
cat(paste(nrow(df),"\n\n"))
}
cat(paste("Number of rows at end == ",nrow(df)))
最后,我的数据框如下所示
col1 col2 newcol
1 1 2 val1
2 1 2 val1
3 1 2 val2
4 1 2 val2
5 1 2 val3
6 1 2 val3
7 1 2 val4
8 1 2 val4
9 1 2 val5
10 1 2 val5
11 NA NA val5
12 NA NA val5
13 NA NA val5
14 NA NA val5
15 NA NA val5
16 NA NA val5
17 NA NA val5
18 NA NA val5
答案 0 :(得分:3)
您可以更改
df[bucket[i-1]+1:bucket[i],"newcol"] = paste0("val",i)
到
df[(bucket[i-1]+1):bucket[i],"newcol"] = paste0("val",i)
在循环中并运行它以获取
df
# col1 col2 newcol
#1 1 2 val1
#2 1 2 val1
#3 1 2 val2
#4 1 2 val2
#5 1 2 val3
#6 1 2 val3
#7 1 2 val4
#8 1 2 val4
#9 1 2 val5
#10 1 2 val5
作为一个例子
bucket[2-1]+1 : bucket[2]
#[1] 3 4 5 6
由于运算符优先级,它正在执行
bucket[2-1]+(1:bucket[2])
#[1] 3 4 5 6
为了纠正它,我们可以用大括号分开这些部分
(bucket[2-1]+1):bucket[2]
#[1] 3 4