假设我有一个数据集(mydata
)并想添加一个新列(newvar
):
newvar <- c(11, 5, 6, 7, 3, 12, 4, 5, 9)
mydata$newvar <- newvar
如何添加一个新列,其值严格增加1到3百万?
当然我写不出类似的东西:
newvar <- c(1, 2, 3, 4, 5, ..., 3000000)
答案 0 :(得分:2)
newvar <- 1:3000000
mydata$newvar <- newvar
答案 1 :(得分:2)
让我们回顾一下在R中创建序列的方法。
### Method 1
newvar1 <- 1:3000000
##3 Method 2
newvar2 <- seq(1, 3000000, by = 1)
### Method 3
newvar3 <- seq(1L, 3000000L)
### Method 4
newvar4 <- seq.int(1L, 3000000L)
### method 5
newvar5 <- seq_len(3000000)
### Method 6
# Create example data frame
mydata <- data.frame(Var = runif(3000000))
newvar6 <- seq_along(mydata$Var)
方法1使用:
创建序列。方法2和方法3使用seq
指定序列的from
和to
。请注意,方法2的输出为numeric
,而方法3为integer
,表明指定from
和to
的方式对于类的类型很重要输出
方法4使用seq.int
。方法5使用seq_len
指定length.out
参数,这是一个显示序列长度的数字方法6使用seq_along
指定along.with
参数,这是一个矢量与所需输出的长度相同。这意味着我们可以将along.with
指定为与目标数据框中的一列相同。
我使用microbenchmark
包来比较这些方法的速度。请注意,在这些方法中,方法2的输出为numeric
,而其他所有输出均为integer
。
library(microbenchmark)
library(ggplot2)
m <-microbenchmark(m1 = {1:3000000},
m2 = {seq(1, 3000000, by = 1)},
m3 = {seq(1L, 3000000L)},
m4 = {seq.int(1L, 3000000L)},
m5 = {seq_len(3000000)},
m6 = {seq_along(mydata$Var)},
times = 1000)
m
# Unit: milliseconds
# expr min lq mean median uq max neval
# m1 3.646180 3.902131 7.614828 4.121517 4.825223 202.5163 1000
# m2 39.496001 44.544780 59.336825 52.322098 59.685341 291.0407 1000
# m3 3.701989 3.978467 7.353326 4.181496 4.832920 154.9543 1000
# m4 3.675046 3.938375 7.085586 4.132423 4.670625 166.1905 1000
# m5 3.674405 3.928431 7.744393 4.129857 4.793149 153.2762 1000
# m6 3.724440 3.959223 7.021631 4.192081 4.810148 158.8564 1000
autoplot(m)
结果表明,方法2比其他方法慢很多,但其他方法没有显着差异。
答案 2 :(得分:1)
你应该这样做:
newvar <- seq(1, 3000000, 1)