如何在一行中转换不同的级别
how to convert different levels in one row
我有一组数据如下:
BETA_LACT R I S
- 23 25 91
- 30 0 109
- 0 0 136
+ 73 0 0
+ 14 0 59
+ 0 0 49
我想将数据转换成以下格式:
R_- I_- S_- R_+ I_+ S_+
23 25 91 73 0 0
30 0 109 14 0 59
0 0 136 0 0 49
我尝试了 spread() 但失败了,有人可以帮助我吗?
我怀疑您使用 spread
和 gather
时遇到的问题是您的示例数据中没有任何内容可以建议应折叠哪些行。作为一个 human,我可以观察到您希望合并第 1 行和第 4 行、第 2 行和第 5 行等。但是,您的数据集中没有其他列或 "keys" persay以表明这一点。
一个解决方案是添加一个索引列,正如我在下面的第二个示例中使用 group_by
和 mutate
所示。以下 reprex
(可重现的示例)显示了一个与您的案例类似的非工作示例和一个工作示例。
library(tidyr)
library(dplyr)
example_data <- data.frame(
categ = rep(1:3, 3),
x = 1:9,
y = 11:19,
z = 21:29
)
# won't work
example_data %>%
gather(var, value, -categ) %>%
unite(new_col_name, var, categ) %>%
spread(new_col_name, value)
#> Error: Duplicate identifiers for rows (1, 4, 7), (2, 5, 8), (3, 6, 9), (10, 13, 16), (11, 14, 17), (12, 15, 18), (19, 22, 25), (20, 23, 26), (21, 24, 27)
# will work
example_data %>%
group_by(categ) %>%
mutate(id = row_number()) %>%
gather(var, value, -categ, -id) %>%
unite(new_col_name, var, categ) %>%
spread(new_col_name, value)
#> # A tibble: 3 x 10
#> id x_1 x_2 x_3 y_1 y_2 y_3 z_1 z_2 z_3
#> * <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#> 1 1 1 2 3 11 12 13 21 22 23
#> 2 2 4 5 6 14 15 16 24 25 26
#> 3 3 7 8 9 17 18 19 27 28 29
(作为旁注,请查看 reprex
包!这有助于您提出 "reproducible example" 并提出更好的问题,这将促进更好的社区支持。注意这有多容易就是复制上面的代码运行到本地。)
我有一组数据如下:
BETA_LACT R I S
- 23 25 91
- 30 0 109
- 0 0 136
+ 73 0 0
+ 14 0 59
+ 0 0 49
我想将数据转换成以下格式:
R_- I_- S_- R_+ I_+ S_+
23 25 91 73 0 0
30 0 109 14 0 59
0 0 136 0 0 49
我尝试了 spread() 但失败了,有人可以帮助我吗?
我怀疑您使用 spread
和 gather
时遇到的问题是您的示例数据中没有任何内容可以建议应折叠哪些行。作为一个 human,我可以观察到您希望合并第 1 行和第 4 行、第 2 行和第 5 行等。但是,您的数据集中没有其他列或 "keys" persay以表明这一点。
一个解决方案是添加一个索引列,正如我在下面的第二个示例中使用 group_by
和 mutate
所示。以下 reprex
(可重现的示例)显示了一个与您的案例类似的非工作示例和一个工作示例。
library(tidyr)
library(dplyr)
example_data <- data.frame(
categ = rep(1:3, 3),
x = 1:9,
y = 11:19,
z = 21:29
)
# won't work
example_data %>%
gather(var, value, -categ) %>%
unite(new_col_name, var, categ) %>%
spread(new_col_name, value)
#> Error: Duplicate identifiers for rows (1, 4, 7), (2, 5, 8), (3, 6, 9), (10, 13, 16), (11, 14, 17), (12, 15, 18), (19, 22, 25), (20, 23, 26), (21, 24, 27)
# will work
example_data %>%
group_by(categ) %>%
mutate(id = row_number()) %>%
gather(var, value, -categ, -id) %>%
unite(new_col_name, var, categ) %>%
spread(new_col_name, value)
#> # A tibble: 3 x 10
#> id x_1 x_2 x_3 y_1 y_2 y_3 z_1 z_2 z_3
#> * <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#> 1 1 1 2 3 11 12 13 21 22 23
#> 2 2 4 5 6 14 15 16 24 25 26
#> 3 3 7 8 9 17 18 19 27 28 29
(作为旁注,请查看 reprex
包!这有助于您提出 "reproducible example" 并提出更好的问题,这将促进更好的社区支持。注意这有多容易就是复制上面的代码运行到本地。)