我需要pivot_wider个我的数据集.我希望将重复的值添加到新行中(而不是将重复的值显示为列表).下面的代码是我试图实现这一点的方法.使用此代码,列出的项将移动到新列,但该行中的其他值将被复制.

df = data.frame(variables = c('a', 'b', 'c', 'c'),
                values = c(1, 2, 3, 4),
                dates = c(6, 6, 6, 6))

df_wide <- df %>%
  pivot_wider(names_from = variables,
              values_from = values,
              values_fill = NA,
              values_fn = list) %>%
  unnest()

结果:

# A tibble: 2 × 4
  dates     a     b     c
  <dbl> <dbl> <dbl> <dbl>
1     6     1     2     3
2     6     1     2     4

Desired 结果:

# A tibble: 2 × 4
  dates     a     b     c
  <dbl> <dbl> <dbl> <dbl>
1     6     1     2     3
2     NA    NA    NA    4

UPDATE

使用下面的答案,我能够接近我需要的东西.

以下是一个更复杂的数据集:

df <- data.frame(RK = c(1,1,1,1,
                        1,1,1,1,
                        1,2,2,2,
                        1,2,2,3,
                        3,3,3,3,
                        3,3,3,4,
                        4,4,5,5,
                        6,6,6,6,
                        7,7,7,7),
                 Name = paste0("Name", seq(1:36)),
                 Position = rep(paste("POS", seq(1:4)),9))

# Code
df %>% 
  mutate(cnt = row_number(), .by = Position) %>%
  pivot_wider(names_from = Position, 
              values_from = Name) %>%
  select(-cnt) %>%
  arrange(RK)

# Result
# A tibble: 14 × 5
      RK `POS 1` `POS 2` `POS 3` `POS 4`
   <dbl> <chr>   <chr>   <chr>   <chr>  
 1     1 Name1   Name2   Name3   Name4  
 2     1 Name5   Name6   Name7   Name8  
 3     1 Name9   NA      NA      NA     
 4     1 Name13  NA      NA      NA     
 5     2 NA      Name10  Name11  Name12 
 6     2 NA      Name14  Name15  NA     
 7     3 NA      NA      NA      Name16 
 8     3 Name17  Name18  Name19  Name20 
 9     3 Name21  Name22  Name23  NA     
10     4 NA      NA      NA      Name24 
11     4 Name25  Name26  NA      NA     
12     5 NA      NA      Name27  Name28 
13     6 Name29  Name30  Name31  Name32 
14     7 Name33  Name34  Name35  Name36 

Remaining issue个 对于rk==3,我希望将结果移位,以便rk==3的第1行包含所有姓名,并且该行的Nas显示在姓名之后.因此,在本例中,RK==3将只需要2行名称,而不是3行,而RK==4将只需要1行.

推荐答案

对于更复杂的示例,您需要按RK和位置分组,以获得所描述的结果,即

library(tidyverse)

df <- data.frame(RK = c(1,1,1,1,
                        1,1,1,1,
                        1,2,2,2,
                        1,2,2,3,
                        3,3,3,3,
                        3,3,3,4,
                        4,4,5,5,
                        6,6,6,6,
                        7,7,7,7),
                 Name = paste0("Name", seq(1:36)),
                 Position = rep(paste("POS", seq(1:4)),9))

df %>%
  group_by(RK, Position) %>%
  mutate(cnt = row_number()) %>%
  pivot_wider(names_from = Position, 
              values_from = Name) %>%
  select(-cnt) %>%
  arrange(RK)
#> # A tibble: 12 × 5
#> # Groups:   RK [7]
#>       RK `POS 1` `POS 2` `POS 3` `POS 4`
#>    <dbl> <chr>   <chr>   <chr>   <chr>  
#>  1     1 Name1   Name2   Name3   Name4  
#>  2     1 Name5   Name6   Name7   Name8  
#>  3     1 Name9   <NA>    <NA>    <NA>   
#>  4     1 Name13  <NA>    <NA>    <NA>   
#>  5     2 <NA>    Name10  Name11  Name12 
#>  6     2 <NA>    Name14  Name15  <NA>   
#>  7     3 Name17  Name18  Name19  Name16 
#>  8     3 Name21  Name22  Name23  Name20 
#>  9     4 Name25  Name26  <NA>    Name24 
#> 10     5 <NA>    <NA>    Name27  Name28 
#> 11     6 Name29  Name30  Name31  Name32 
#> 12     7 Name33  Name34  Name35  Name36

创建于2023-07-26,共reprex v2.0.2

这能解决你的问题吗?或者,你还想做进一步的"调整"吗?

R相关问答推荐

在ComplexHeatmap中,如何更改anno_barplot()标题的Angular ?

如何将具有重复名称的收件箱合并到R中的另一列中,而结果不同?

ggplot 2中的地块底图(basemaps_gglayer()不起作用)

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

检测(并替换)字符串中的数学符号

单击 map 后,将坐标复制到剪贴板

R中具有gggplot 2的Likert图,具有不同的排名水平和显示百分比

基于不同组的列的相关性

从所有项的 struct 相同的两级列表中,将该第二级中的所有同名项绑定在一起

在R中按行按列范围查找最大值的名称

根据列A中的差异变异列,其中行由列B中的相对值标识

仅当后续值与特定值匹配时,才在列中回填Nas

Rmarkdown::Render vs Source()

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

具有自定义仓位限制和计数的GGPLATE直方图

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?

以R表示的NaN值的IS.NA状态

如何创建直方图与对齐的每月箱?

R中的交叉表

如何将数据框压缩为更宽,同时将行输入保持为行输入,而不是R中的列名?