如何在一行中转换不同的级别

问题描述 投票:0回答:1

我有一组如下数据:

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

我尝试传播()但失败了,任何人都可以帮助我吗?

r tidyverse spread
1个回答
0
投票

我怀疑你使用spreadgather的问题是你的样本数据没有提示哪些行应该被折叠。作为人类,我可以观察到您希望组合第1行和第4行,第2行和第5行等。但是,数据集中没有其他列或“键”表示这一点。

一种解决方案是使用group_bymutate添加索引列,如下面第二个示例所示。以下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包!这有助于您制作一个“可重复的示例”并提出更好的问题,这将有助于更好的社区支持。请注意复制上述代码并在本地运行它是多么容易。)

© www.soinside.com 2019 - 2024. All rights reserved.