如何分配或 "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
我很难将其转化为问题的形式。我有这样一种情况,即列(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