将R转换为宽格式,并根据列中的值进行排列

  • 本文关键字:排列 转换 格式 r dplyr pivot
  • 更新时间 :
  • 英文 :


我得到了一个包含来自不同样本的数据的表("sample1"等),其中几种类型的测量(A到C)进行。每次测量给出3个值:浓度、最大值和最小值。

my.sample <- c("sample1", "sample1", "sample2", "sample2", "sample3")
type <- c("A", "B", "A", "C", "C")
concentration <- c(12, 5, 7, 10, 14)
max <- c(13, 6, 7, 11, 15)
min <- c(11, 4, 6, 9, 13)
mydata <- data.frame(my.sample, type, concentration, max, min)
> mydata
my.sample type concentration max min
1   sample1    A            12  13  11
2   sample1    B             5   6   4
3   sample2    A             7   7   6
4   sample2    C            10  11   9
5   sample3    C            14  15  13

我想将此数据转换为一个新表,其中每个样本只有一行。这意味着为每种测量类型创建3列(浓度,最大值,最小值),并在列中显示测量类型。缺失值应定义为NA。下面是我想要获得的结果的示例:

A_concentration <- c(12, 7, NA)
A_max <- c(13, 7, NA)
A_min <- c(11, 6, NA)
B_concentration <- c(5, NA, NA)
B_max <- c(6, NA, NA)
B_min <- c(4, NA, NA)
C_concentration <- c(NA, 10, 14)
C_max <- c(NA, 11, 15)
C_min <- c(NA, 9, 13)
mydata.new <- data.frame(my.sample.new, A_concentration, A_max, A_min, B_concentration, B_max, B_min, C_concentration, C_max, C_min)
> mydata.new
my.sample.new A_concentration A_max A_min B_concentration B_max B_min
1       sample1              12    13    11               5     6     4
2       sample2               7     7     6              NA    NA    NA
3       sample3              NA    NA    NA              NA    NA    NA
C_concentration C_max C_min
1              NA    NA    NA
2              10    11     9
3              14    15    13

是否有一种方法可以根据条件扩大数据,并在列名中包含一个值(这里:来自type) ?我的真实数据集中有更多的类型,所以理想情况下它应该是可推广的。

这行得通:

library(dplyr)
mydata %>% 
pivot_wider(id_cols = my.sample, names_from = type, values_from = c(concentration, max, min), names_glue = "{type}_{.value}") %>% 
select(my.sample, starts_with("A"), starts_with("B"), starts_with("C"))

这给了我们:

# A tibble: 3 x 10
my.sample A_concentration B_concentration C_concentration A_max B_max C_max A_min B_min C_min
<chr>               <dbl>           <dbl>           <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 sample1                12               5              NA    13     6    NA    11     4    NA
2 sample2                 7              NA              10     7    NA    11     6    NA     9
3 sample3                NA              NA              14    NA    NA    15    NA    NA    13