如何通过添加重复列来旋转数据框

问题描述 投票:0回答:2

我有一个数据框,其中有重复的值,我想将其作为唯一标识符列。数据框的其他列包含我想通过创建新的“重复”列来保留的数据。例如,给定以下数据框:

sample_df <- data.frame(
  id = c(1, 1, 1, 2, 2, 3, 3, 3, 3),
  test = c("A", "B", "C", "A", "B", "A", "B", "C", "D"),
  result = c(93, 88, 89, 73, 89, 71, 73, 73, 75)
)
sample_df

#   id test result
# 1  1    A     93
# 2  1    B     88
# 3  1    C     89
# 4  2    A     73
# 5  2    B     89
# 6  3    A     71
# 7  3    B     73
# 8  3    C     73
# 9  3    D     75

有没有办法通过添加非 id 列的新迭代来改变这一点?我在想这样的事情:

#   id test1 result1 test2 result2 test3 result3 test4 result4
# 1  1     A      93     B      88     C      89  <NA>      NA
# 2  2     A      73     B      89  <NA>      NA  <NA>      NA
# 3  3     A      71     B      73     C      73     D      75

id 列中的最大重复数决定了将非 id 列的新迭代数量加入到数据帧中。

我尝试使用

tidyr::pivot_wider()
执行此操作,但使用此函数,我只能根据列的 values 生成输出列(例如,返回
A
B
C
D
作为输出列,而不是
test1
result1
test2
result2
等)。我也可能只是缺乏适当的术语来寻找其他答案来源。

r dataframe reshape
2个回答
2
投票

您可以在每个

id
中创建一个“观察编号”列,并将其传递给
names_from
中的
pivot_wider()

library(dplyr) # >= 1.1.0
library(tidyr)

sample_df %>%
  mutate(obs = row_number(), .by = id) %>%
  pivot_wider(
    values_from = test:result, 
    names_from = obs, 
    names_sep = "",
    names_vary = "slowest"
  )
# A tibble: 3 × 9
     id test1 result1 test2 result2 test3 result3 test4 result4
  <dbl> <chr>   <dbl> <chr>   <dbl> <chr>   <dbl> <chr>   <dbl>
1     1 A          93 B          88 C          89 <NA>       NA
2     2 A          73 B          89 <NA>       NA <NA>       NA
3     3 A          71 B          73 C          73 D          75

1
投票

使用基本 R

reshape

reshape(sample_df, idvar='id', timevar='test', direction='wide', v.names=c('test', 'result'))
#   id test.A result.A test.B result.B test.C result.C test.D result.D
# 1  1      A       93      B       88      C       89   <NA>       NA
# 4  2      A       73      B       89   <NA>       NA   <NA>       NA
# 6  3      A       71      B       73      C       73      D       75
© www.soinside.com 2019 - 2024. All rights reserved.