为什么数据框中的行数会增加?

时间:2015-04-19 06:29:33

标签: r dataframe

我从一个有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

1 个答案:

答案 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