如何分配或 "rotate" 数据框列的单元格值,以便它们填充上面的空白行?

How to distribute or "rotate" cell values of a dataframe column so that they fill blank rows above?

我很难将其转化为问题的形式。我有这样一种情况,即列(B 列)中的数据以这样一种方式记录:与指标(A 列)相关的所有值最终都在指标的每个值中的最底部的行中。或者更简单地说,像这样:

(my_df <- data.frame(
    A = c(rep(1, 6), rep(2, 6)),
    B = c(rep(NA, 5), "a,b,c,d,e,f", rep(NA, 5), "g,h,i,j,k,l")
))
#>    A           B
#> 1  1        <NA>
#> 2  1        <NA>
#> 3  1        <NA>
#> 4  1        <NA>
#> 5  1        <NA>
#> 6  1 a,b,c,d,e,f
#> 7  2        <NA>
#> 8  2        <NA>
#> 9  2        <NA>
#> 10 2        <NA>
#> 11 2        <NA>
#> 12 2 g,h,i,j,k,l

reprex package (v2.0.1)

于 2022-01-28 创建

我正在尝试找到一种简单的方法来向上分布单元格内容,以便它们根据各自的代码位于正确的行中:

(expected_df_1 <- data.frame(
    A = c(rep(1, 6), rep(2, 6)),
    B = c(letters[1:6], letters[7:12])
))
#>    A B
#> 1  1 a
#> 2  1 b
#> 3  1 c
#> 4  1 d
#> 5  1 e
#> 6  1 f
#> 7  2 g
#> 8  2 h
#> 9  2 i
#> 10 2 j
#> 11 2 k
#> 12 2 l

reprex package (v2.0.1)

于 2022-01-28 创建

这样也行:

(expected_df_2 <- data.frame(
    A = c(rep(1, 6), rep(2, 6)),
    B = c(rep(NA, 5), "a,b,c,d,e,f", rep(NA, 5), "g,h,i,j,k,l"),
    C = c(letters[1:6], letters[7:12])
))
#>    A           B C
#> 1  1        <NA> a
#> 2  1        <NA> b
#> 3  1        <NA> c
#> 4  1        <NA> d
#> 5  1        <NA> e
#> 6  1 a,b,c,d,e,f f
#> 7  2        <NA> g
#> 8  2        <NA> h
#> 9  2        <NA> i
#> 10 2        <NA> j
#> 11 2        <NA> k
#> 12 2 g,h,i,j,k,l l

reprex package (v2.0.1)

于 2022-01-28 创建

我这辈子都找不到解决办法。想法?如果可能的话,我最好留在 tidyverse 框架内,但我会采纳任何建议!

一个可能的解决方案,首先删除所有 NA 然后分成行,用逗号将元素放在一起:

library(tidyverse)

my_df <- data.frame(
  A = c(rep(1, 6), rep(2, 6)),
  B = c(rep(NA, 5), "a,b,c,d,e,f", rep(NA, 5), "g,h,i,j,k,l")
)

my_df %>% 
  drop_na(B) %>% 
  separate_rows(B, sep=",") 

#> # A tibble: 12 × 2
#>        A B    
#>    <dbl> <chr>
#>  1     1 a    
#>  2     1 b    
#>  3     1 c    
#>  4     1 d    
#>  5     1 e    
#>  6     1 f    
#>  7     2 g    
#>  8     2 h    
#>  9     2 i    
#> 10     2 j    
#> 11     2 k    
#> 12     2 l

尝试另一种选择。按列 A 分组后,对列 B 中的逗号分隔值使用 strsplit(删除 NA)。

library(tidyverse)

my_df %>%
  group_by(A) %>%
  mutate(B = unlist(strsplit(na.omit(B), ',')))

输出

       A B    
   <dbl> <chr>
 1     1 a    
 2     1 b    
 3     1 c    
 4     1 d    
 5     1 e    
 6     1 f    
 7     2 g    
 8     2 h    
 9     2 i    
10     2 j    
11     2 k    
12     2 l