我有这样的代码:
bulk <- read_csv("data/food_bulk_raw.csv") %>%
mutate(Treatment = "bulk", Individual = seq_len(Timestamp))
seq_len()
正在创建一个1:length(Timestamp)
列表。它之所以有效,是因为"时间戳"是数据框的一列。但是假设我对我的数据帧一无所知:也许我正在创建一个函数。如何在不先将其保存为对象的情况下指示数据框的长度,如下所示?
data002 <- read_csv("data/data002.csv")
data002 <- mutate(data002, New_Column = 1:nrow(data002))
您可以使用以下任何一种
library(tidyverse)
#Option 1
read_csv("data/food_bulk_raw.csv") %>%
mutate(Treatment = "bulk", Individual = seq_len(nrow(.)))
#Option 2
read_csv("data/food_bulk_raw.csv") %>%
mutate(Treatment = "bulk", Individual = seq(nrow(.)))
#Option 3
read_csv("data/food_bulk_raw.csv") %>%
mutate(Treatment = "bulk", Individual = sequence(nrow(.)))
所有这些都不依赖于任何列,而是使用nrow
来创建序列。
同样如@Marius评论,您还可以使用n()
返回行数而不是nrow
。因此,在上述所有选项中,nrow(.)
都可以替换为n()
.
除此之外,我们还可以使用row_number
read_csv("data/food_bulk_raw.csv") %>%
mutate(Treatment = "bulk", Individual = row_number())
为了演示,制作一个函数
df_sequence_func <- function(df) {
df %>% mutate(Individual = seq_len(nrow(.)))
}
df_sequence_func(mtcars)
# mpg cyl disp hp drat wt qsec vs am gear carb Individual
#1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 1
#2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 2
#3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 3
#4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 4
#....
df_sequence_func(cars)
# speed dist Individual
#1 4 2 1
#2 4 10 2
#3 7 4 3
#4 7 22 4
#5 8 16 5
#6 9 10 6
#....
它返回一个连续的行号,而不考虑数据框中的列或行。
我们可以使用data.table
方法
library(data.table)
setDT(df)[, seq_len(.N)]
并且可以fread
阅读
fread("data/food_bulk_raw.csv")[,
c("Treatment", "Individual") := .("bulk", seq_len(.N))][]
或tidyverse
library(tidyverse)
rownames_to_column(data002, 'rn')
或使用
data002 %>%
mutate(New_Column = seq_len(n()))
或base R
df$newcolumn <- seq(nrow(df))