r语言 - 使用 Tidyr 管道插入时如何获取任意数据框的长度?



我有这样的代码:

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))

最新更新