【发布时间】:2019-05-08 20:11:41
【问题描述】:
我正在使用tidyverse,但也欢迎使用base 解决方案。
有没有办法在不转置 gather 数据帧的情况下,但 key 不是列名,而是 key 存储在一行中。例如,假设我有一个名为 df 的 tibble。
df <- tibble(a = c(5,3,5,6,2,"G1"),
b = c(5,3,5,6,2,"G1"),
c = c(8,2,6,4,1,"G2"),
d = c(8,2,6,4,1,"G2"),
e = c(9,3,7,8,4,"G3"),
f = c(9,3,7,8,4,"G3"),
g = c(6,5,2,1,8,"G4"),
h = c(6,5,2,1,8,"G4"))
df
# A tibble: 6 x 8
a b c d e f g h
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 5 5 8 8 9 9 6 6
2 3 3 2 2 3 3 5 5
3 5 5 6 6 7 7 2 2
4 6 6 4 4 8 8 1 1
5 2 2 1 1 4 4 8 8
6 G1 G1 G2 G2 G3 G3 G4 G4
要分组或聚集的组位于底行。有没有办法让df 只有三列,使 c、e 和 g 列聚集到 a 列,d、f 和 h 列聚集到 b 列,第 6 行变成 c 列?结果如下:
tibble(a = c(5,3,5,6,2,8,2,6,4,1,9,3,7,8,4,6,5,2,1,8),
b = c(5,3,5,6,2,8,2,6,4,1,9,3,7,8,4,6,5,2,1,8),
c = c("G1","G1","G1","G1","G1","G2","G2","G2","G2","G2",
"G3","G3","G3","G3","G3","G4","G4","G4","G4","G4"))
# A tibble: 20 x 3
a b c
<dbl> <dbl> <chr>
1 5 5 G1
2 3 3 G1
3 5 5 G1
4 6 6 G1
5 2 2 G1
6 8 8 G2
7 2 2 G2
8 6 6 G2
9 4 4 G2
10 1 1 G2
11 9 9 G3
12 3 3 G3
13 7 7 G3
14 8 8 G3
15 4 4 G3
16 6 6 G4
17 5 5 G4
18 2 2 G4
19 1 1 G4
20 8 8 G4
我想避免转置,因为我需要保留行和列的顺序,直到所有内容都正确标记为止。
【问题讨论】:
-
试试
data.frame(a = c(df$a, unlist(df[c("c", "e","g")])), b = c(df$b, unlist(df[c("d", "f", "h")]))) %>% group_by(grp = lag(cumsum(grepl("^G", a)), default = 0)) %>% mutate(c = b[n()]) -
@akrun 它可以工作,但并不完美。但问题在于您必须在
unlist中指定列。我的列比示例 df 多得多,因此最好无需指定列名即可解决此问题。 -
我只是想问一下。您是否有任何列模式,例如特定顺序以及留下多少列(这里是 a 和 b)
-
好的,你的问题得到了答案。希望对你有用