使用Tidyr进行管道传输时,如何获取任意数据帧的长度?

时间:2019-07-02 04:13:36

标签: r tidyverse 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))

2 个答案:

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