我如何在R中将多行的值分布到多列

qrjkbowd  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(116)

我觉得这是一个非常简单的过程,但我还没有设法做到这一点。我有一个像这样的df:

book_title  author
book1       bob
book1       jane
book2       alice
book2       fred
book2       greg
book3       louise
book3       sam

我想把它变成这样:

book_title  author_1  author_2  author_3
book1       bob       jane      NA
book2       alice     fred      greg
book3       louise    sam       NA

我知道spread()、pivot_wider()和separate()不会有太大的用处。非常感谢所有的帮助!

ymdaylpp

ymdaylpp1#

我已经包括了三种方法来做到这一点:base R方法(即不使用软件包)、tidyverse方法和data.table解决方案。
我通常不会使用base R来重塑wide/long,因为我发现语法有点混乱-尽管在这种情况下它不是太糟糕。在我看来,tidyverse语法是最直观的。但是,对于大型数据集,它可能比data.table慢得多

基本R方法

dt$author_num <- unlist(lapply(rle(dt$book_title)$lengths, seq))

reshape(
    dt,
    idvar = "book_title",
    timevar = "author_num",
    direction = "wide",
    sep = "_"
)

#   book_title author_1 author_2 author_3
# 1      book1      bob     jane     <NA>
# 3      book2    alice     fred     greg
# 6      book3   louise      sam     <NA>

tidyverse方法

library(dplyr)
library(tidyr)

dt  |>
  group_by(book_title)  |>
  mutate(author_num = paste0(
    "author_", row_number()
  ))  |>
  pivot_wider(
    id_cols = book_title,
    names_from = author_num,
    values_from = author
  )

# # A tibble: 3 × 4
# # Groups:   book_title [3]
#   book_title author_1 author_2 author_3
#   <chr>      <chr>    <chr>    <chr>   
# 1 book1      bob      jane     NA      
# 2 book2      alice    fred     greg    
# 3 book3      louise   sam      NA

数据表方法

下面是一个使用data.table::dcast函数的方法:

library(data.table)
setDT(dt)

dt[,
    author_num := paste0("author_", seq_len(.N)),
    by = book_title
]

dcast(dt, book_title ~ author_num, value.var = "author")

#    book_title author_1 author_2 author_3
#        <char>   <char>   <char>   <char>
# 1:      book1      bob     jane     <NA>
# 2:      book2    alice     fred     greg
# 3:      book3   louise      sam     <NA>

原始数据

dt  <- read.table(text = "book_title  author
book1       bob
book1       jane
book2       alice
book2       fred
book2       greg
book3       louise
book3       sam", h = T)

相关问题