我有这样的代码:
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))
答案 0 :(得分:2)
您可以使用以下任何一种方式
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
#....
它返回顺序的行号,而与数据框中的列或行无关。
答案 1 :(得分:1)
我们可以使用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))