使列表的每个元素都是自己的行(基于列值的列表)

时间:2017-08-29 14:21:48

标签: r dataframe dplyr tidyr

我有这个data.frame对象:

subject <- c("Nantes", "Nantes", "Nantes", "Brest", "Brest", "Rennes")
page <- c(1, 2, 3, 1, 2, 1)
rows <- c(2, 3, 4, 6, 2, 3)
df <- data.frame (subject,page, rows)

这是输出:

subject   page    rows 
Nantes    1       2     
Nantes    2       3     
Nantes    3       4     
Brest     1       6     
Brest     2       2     
Rennes    1       3

南特的主题:第1页第2页,第3页 每个页面都有不同的行数。对于南特,第1页有2行。

我想要的:根据1:nrow序列复制每一行。

例如:我需要将Nantes第1页dpulicate两次

subject   page    rows 
Nantes    1       1     
Nantes    1       2     
Nantes    2       1 
Nantes    2       2
Nantes    2       3
Nantes    3       1
Nantes    3       2
Nantes    3       3
Nantes    3       3
Nantes    3       4 
Brest     1       1
Brest     1       2 
Brest     1       3 
Brest     1       4 
Brest     1       5 
Brest     1       6     
Rennes    1       1
Rennes    1       2
Rennes    1       3

基于dplyr duplicate each line by a sequence我可以使用不需要的功能,但无法解决我的问题。

4 个答案:

答案 0 :(得分:6)

在基地R,你可以做

dfNew <- data.frame(subject=rep(df$subject, df$rows),
                    page=rep(df$page, df$rows),
                    rows=sequence(df$rows))
带有向量参数的

rep在第二个位置重复第一个位置的元素相应的次数。带有整数向量的sequence返回从1到每个值的计数。

dfNew
   subject page rows
1   Nantes    1    1
2   Nantes    1    2
3   Nantes    2    1
4   Nantes    2    2
5   Nantes    2    3
6   Nantes    3    1
7   Nantes    3    2
8   Nantes    3    3
9   Nantes    3    4
10   Brest    1    1
11   Brest    1    2
12   Brest    1    3
13   Brest    1    4
14   Brest    1    5
15   Brest    1    6
16   Brest    2    1
17   Brest    2    2
18  Rennes    1    1
19  Rennes    1    2
20  Rennes    1    3

使用with时可能更清洁:

dfNew <- with(df, data.frame(subject=rep(subject, rows),
                             page=rep(page, rows),
                             rows=sequence(rows)))

答案 1 :(得分:5)

如果您按其他列进行分组,则可以ID ParentID Name 1 null a 2 1 b 3 2 c 4 1 d 5 4 e 使用tidyr::complete填写缺少的观察结果:

seq

这种方法的优点是,如果一个library(tidyverse) df <- data_frame(subject = c("Nantes", "Nantes", "Nantes", "Brest", "Brest", "Rennes"), page = c(1,2,3,1,2, 1), rows = c(2, 3, 4, 6, 2, 3)) df_expanded <- df %>% group_by(subject, page) %>% complete(rows = seq(rows)) df_expanded #> # A tibble: 20 x 3 #> # Groups: subject, page [6] #> subject page rows #> <chr> <dbl> <dbl> #> 1 Brest 1 1 #> 2 Brest 1 2 #> 3 Brest 1 3 #> 4 Brest 1 4 #> 5 Brest 1 5 #> 6 Brest 1 6 #> 7 Brest 2 1 #> 8 Brest 2 2 #> 9 Nantes 1 1 #> 10 Nantes 1 2 #> 11 Nantes 2 1 #> 12 Nantes 2 2 #> 13 Nantes 2 3 #> 14 Nantes 3 1 #> 15 Nantes 3 2 #> 16 Nantes 3 3 #> 17 Nantes 3 4 #> 18 Rennes 1 1 #> 19 Rennes 1 2 #> 20 Rennes 1 3 / subject组合已经部分扩展,则不会重复。

答案 2 :(得分:3)

我们可以使用export GCC_COLORS="quote=01:32" 包中的map来创建purrr中的整数序列列表。之后,rows数据框。 unnest是最终输出。

df2

答案 3 :(得分:1)

只要它不是一个庞大的数据框架,apply也可以工作

do.call(rbind, apply(X = df, MARGIN = 1, function(x)
    data.frame(subject = x[1],
               page = as.numeric(x[2]),
               rows = sequence(x[3]),
               row.names = NULL)))