преобразовать отдельные факторы (в строках) в отдельные столбцы и перенести связанные числа над оставшимся фактором - PullRequest
1 голос
/ 23 января 2020

У меня есть data.frame, который выглядит следующим образом:

df <- data.frame(plot=as.factor(rep(c('A','B'), each = 5)), 
                 group=as.factor(c('BO','BO','SM','SM','SM','BO','BO','SM','SM','SM')), 
                 para=c('pH','pH','Co','Cr','Cu','pH','pH','Co','Cr','Cu'), 
                 value=c(7.5,7,80,10,30,6.5,6,50,30,40), 
                 method=c('H2o','Cal','Sal','Sal','Sal','H2o','Cal','Sal1','Sal1','Sal1'))

        plot group para value method
    1     A    BO   pH   7.5    H2o
    2     A    BO   pH   7.0    Cal
    3     A    SM   Co  80.0    Sal
    4     A    SM   Cr  10.0    Sal
    5     A    SM   Cu  30.0    Sal
    6     B    BO   pH   6.5    H2o
    7     B    BO   pH   6.0    Cal
    8     B    SM   Co  50.0    Sal1
    9     B    SM   Cr  30.0    Sal1
    10    B    SM   Cu  40.0    Sal1  

Я хотел бы преобразовать факторы 'H2o' и 'Cal' в столбцы и перенести приписанные значения через столбец 'plot'

df2 <- data.frame(plot=as.factor(c('A','A','A','B','B','B')), 
                      SM=c('Co','Cr','Cu','Co','Cr','Cu'),
                      method=c('Sal','Sal','Sal','Sal1','Sal1','Sal1'),
                      value=c(80,10,30,50,30,40),
                      H2o=c(7.5,7.5,7.5,6.5,6.5,6.5),
                      Cal=c(7,7,7,6,6,6))

      plot SM method value H2o Cal
    1    A Co    Sal  80.0 7.5   7
    2    A Cr    Sal  10.0 7.5   7
    3    A Cu    Sal  30.0 7.5   7
    4    B Co   Sal1  50.0 6.5   6
    5    B Cr   Sal1  30.0 6.5   6
    6    B Cu   Sal1  40.0 6.5   6

Я попытаюсь дать вам репрезентативную выборку реального кадра данных, используя «dput».

    dput(emshort[1:30,])

    structure(list(plot = structure(c(365L, 365L, 365L, 365L, 365L, 
    365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 
    365L, 365L, 366L, 366L, 366L, 366L, 366L, 366L, 366L, 366L, 366L, 
    366L, 366L, 366L), .Label = c("1005734", "102335", "1091002", 
    "1091105", "1091106", "10941051", "10941052", "10941053", "10941054", 
    "1191102", "1204702", "1291018", "1305735", "1391115", "13941151",  
    "1713004", "1713005", "1713006", "1791013", "1791124", "1791137", 
    "8218105", "8218106", "8218107", "8218108", "8218109", "8218110", 
    "8218111", "8218112", "8218113", "8218114", "8218115", "8218116", 
    ...
    "LiesbergProfil P3", "WinR160", "WinR161", "WinR162", "WinR163", 
    "WinR164", "WinR165", "WinR166", "WinR167", "WinR169", "WinR170", 
    "WinR174", "WinR181"), class = "factor"), group = structure(c(1L, 
    1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 3L), .Label = c("BOKW", 
    "NAEHR", "SM"), class = "factor"), para = structure(c(24L, 24L, 
    5L, 6L, 8L, 9L, 21L, 23L, 34L, 24L, 24L, 5L, 6L, 8L, 9L, 21L, 
    23L, 34L, 24L, 24L, 5L, 6L, 8L, 9L, 21L, 23L, 34L, 24L, 24L, 
    5L), .Label = c("Al", "As", "B", "Ca", "Cd", "Co", "Corg", "Cr", 
    "Cu", "Fe", "Hg", "Humus", "K", "KAKeff", "KAKpot", "Kalk", "Mg", 
    "Mn", "Mo", "Na", "Ni", "P", "Pb", "pH", "S", "Sb", "Se", "Skelett", 
    "Sn", "Tl", "Ton", "U", "V", "Zn"), class = "factor"), value = c(7.5, 
     7, 0.81, 10, 33, 15, 23, 23, 50, 7.3, 7.9, 0.81, 11, 30, 13, 
    27, 20, 49, 7.5, 7, 1.03, 10, 34, 23, 27, 30, 78, 8.2, 7.5, 0.67
    ), method = structure(c(5L, 4L, 11L, 11L, 11L, 11L, 11L, 11L, 
    11L, 4L, 5L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 5L, 4L, 11L, 
    11L, 11L, 11L, 11L, 11L, 11L, 5L, 4L, 11L), .Label = c("", "allgemeine                         Bodeneigenschaften - Aufschluss, 0.1 M Bariumchlorid +    2M Triethanolamin", 
    "allgemeine Bodeneigenschaften - Aufschluss, Bariumchlorid", 
    "allgemeine Bodeneigenschaften - Aufschluss, Calciumchlorid", 
    "allgemeine Bodeneigenschaften - Aufschluss, H2O", "allgemeine    Bodeneigenschaften - Aufschluss, HCl", 
    "allgemeine Bodeneigenschaften - Aufschluss, Königswasser", "allgemeine Bodeneigenschaften - Aufschluss, Nasschemische Oxidation mit K2Cr2O7 Titration", 
     "Nährstoffe - Aufschluss, 2M Salpetersäure (VBBo total)", "Nährstoffe   - Aufschluss, Königswasser", 
    "Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)", 
    "Schwermetalle - Aufschluss, Königswasser"), class = "factor")),         row.names =       c(NA, 30L), class = "data.frame")´

(я резко сократил уровни графика).

    dfrep
        plot   group  para  value                                                  method
    1  7595050  BOKW   pH  7.50            allgemeine Bodeneigenschaften -    Aufschluss, H2O
    2  7595050  BOKW   pH  7.00 allgemeine Bodeneigenschaften - Aufschluss, Calciumchlorid
    3  7595050    SM   Cd  0.81  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    4  7595050    SM   Co 10.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    5  7595050    SM   Cr 33.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    6  7595050    SM   Cu 15.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    7  7595050    SM   Ni 23.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    8  7595050    SM   Pb 23.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    9  7595050    SM   Zn 50.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    10 7595050  BOKW   pH  7.30 allgemeine Bodeneigenschaften - Aufschluss, Calciumchlorid
    11 7595050  BOKW   pH  7.90            allgemeine Bodeneigenschaften - Aufschluss, H2O
    12 7595050    SM   Cd  0.81  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    13 7595050    SM   Co 11.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    14 7595050    SM   Cr 30.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    15 7595050    SM   Cu 13.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    16 7595050    SM   Ni 27.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    17 7595050    SM   Pb 20.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    18 7595050    SM   Zn 49.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    19 7595059  BOKW   pH  7.50            allgemeine Bodeneigenschaften - Aufschluss, H2O
    20 7595059  BOKW   pH  7.00 allgemeine Bodeneigenschaften - Aufschluss, Calciumchlorid
    21 7595059    SM   Cd  1.03  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    22 7595059    SM   Co 10.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    23 7595059    SM   Cr 34.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    24 7595059    SM   Cu 23.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    25 7595059    SM   Ni 27.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    26 7595059    SM   Pb 30.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    27 7595059    SM   Zn 78.00  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)
    28 7595059  BOKW   pH  8.20            allgemeine Bodeneigenschaften - Aufschluss, H2O
    29 7595059  BOKW   pH  7.50 allgemeine Bodeneigenschaften - Aufschluss, Calciumchlorid
    30 7595059    SM   Cd  0.67  Schwermetalle - Aufschluss, 2M Salpetersäure (VBBo total)

Теперь мне нужно, чтобы эти строки со строкой 'Schwermetalle' и другими группами из группы 'BOKW' и 'NAEHR' были в столбцах go. Подобно тому, что я описал в предыдущем примере, но теперь у меня есть дополнительный уровень группы, который нужно перенести в отдельный столбец.

Я попытался адаптировать код из @akrun следующим образом:

    emnew<-
    emshort  %>%
    filter(!str_detect(method, 'Schwermetalle')) %>% #here detect rows with  other methods too (eg.königswasser)
    select(-group, -para) %>%
    pivot_wider(names_from = method, values_from = value) %>%
    right_join(emshort %>%
                  filter(str_detect(method, 'Schwermetalle'))) %>%
    select(names(emshort), everything()) %>%
    rename(SM = para) %>%
   select(-group)

Я получаю следующее сообщение об ошибке:

    Error: Column 6 must be named.
    Use .name_repair to specify repair.
    Run `rlang::last_error()` to see where the error occurred.
    In addition: Warning message:
   Values in `value` are not uniquely identified; output will contain list-cols.
    * Use `values_fn = list(value = list)` to suppress this warning.
 * Use `values_fn = list(value = length)` to identify where the duplicates arise
   * Use `values_fn = list(value = summary_fun)` to summarise duplicates 

Нужно ли переименовать дополнительный столбец

1 Ответ

1 голос
/ 23 января 2020

Мы можем сделать filter отдельно, а затем сделать соединение

library(dplyr)
library(tidyr)
library(purrr)
df %>% 
  filter(!str_detect(method, 'Sal')) %>%
  select(-group, -para) %>% 
  pivot_wider(names_from = method, values_from = value) %>%
  right_join(df %>%
                filter(str_detect(method, 'Sal'))) %>%
  select(names(df), everything()) %>%
  rename(SM = para) %>%
  select(-group)
#   plot SM value method H2o Cal
#1    A Co    80    Sal 7.5   7
#2    A Cr    10    Sal 7.5   7
#3    A Cu    30    Sal 7.5   7
#4    B Co    50   Sal1 6.5   6
#5    B Cr    30   Sal1 6.5   6
#6    B Cu    40   Sal1 6.5   6
...