Изменение уникальных значений в столбце на одно из двух определенных значений - PullRequest
3 голосов
/ 24 сентября 2019

Сводка

Я пытаюсь организовать фрейм данных, прежде чем изменить его формат.В моем data.frame есть значения, сгруппированные под 2 факторами (factor1 или factor2).Уровни в factor2 сгруппированы в пары (например, 13 и 17) под factor 1.В каждой паре factor2 я бы хотел переименовать одно из чисел в A, а другое B.Порядок переименования является произвольным, и любые значения могут быть A или B.Как видно из предыдущего примера, 13 или 17 могут быть либо A, либо B, если только дается число A и другой B. Обратите внимание, что некоторые уровни в factor1 не имеют пары данных и могут иметь только 1.

После этого я хочу преобразовать фрейм данных в другой формат, как показано ниже (см. # 3)

Вот пример data.frame

sampledata <- data.frame(factor0 = c("A", "A", "H", "H", "A", "A", "H", "H", "A", "A",
                                     "H", "H", "A", "A", "H", "H", "A", "A", "H", "H"), 
                         factor1 = c("1", "1", "2", "2", "3", "3", "4", "4", "5", "5", 
                                     "6", "6", "7", "7", "8", "8", "9", "9", "10", "10"),
                         factor2 = c("13", "17", "14", "18", "5", "15", "19", "16", "20", "17",
                                     "18", "19", "21", "24", "27", "28", "30", "30", "17", "18"), 
                         value1 = c(1, 5, 6, 2, 6, 8, 10, 21, 30, 5, 3, 5, 4, 50, 4, 7, 15, 48, 20, 21,
                         value1.se = c(0.5, 0.5, 0.6, 0.2, 0.6, 0.8, 0.10, 0.21, 0.30, 0.5, 
                                                  0.3, 0.5, 0.4, 1.50, 1.4, 1.7, 1.5, 0.48, 2.1, 21)))

1,Сначала таблица данных будет выглядеть так:

> sampledata
#      factor0   factor1   factor2   value1   value1.se
# 1    A         1         13        1        0.5
# 2    A         1         17        5        0.5
# 3    H         1         14        6        0.6
# 4    H         1         18        2        0.2
# 5    A         2         5         6        0.6
# 6    A         2         15        8        0.8
# 7    H         2         19        10       0.10
# 8    H         2         16        21       0.21

2.После этого таблица будет выглядеть так:

> sampledata
#      factor0    factor1   factor2   value1   value1.se
# 1    A          1         A         1        0.5
# 2    A          1         B         5        0.5
# 3    H          1         A         6        0.6
# 4    H          1         B         2        0.2
# 5    A          2         A         6        0.6
# 6    A          2         B         8        0.8
# 7    H          2         A        10       0.10
# 8    H          2         B        21       0.21

3.Наконец, таблица данных должна выглядеть следующим образом:

> sampledata
#      factor0   factor1   value_A   value_B   se_A   se_B
# 1    A         1         1         5         0.5    0.5
# 2    H         1         6         2         0.6    0.2
# 3    A         2         6         8         0.6    0.8
# 4    H         2         10        21        0.10   0.21

У меня есть еще один фактор, который я хотел бы сгруппировать по (factor0), но я думаю, что справлюсь сам.Основная причина, по которой я хочу организовать данные таким образом, заключается в том, что я могу нанести value_A и valueB друг на друга, при этом factor0 будет окрашен.

Ответы [ 2 ]

3 голосов
/ 24 сентября 2019

Вы можете изменить factor2 на значения A или B, используя длину сгруппированных данных, а затем изменить их, используя pivot_wider() (требуется tidyr v1.0.0).

library(dplyr)
library(tidyr)

sampledata %>%
  group_by(factor0, factor1) %>%
  mutate(factor2 = c("A", "B")[sequence(n())]) %>%
  pivot_wider(names_from = factor2, values_from = c(value1, value1.se))

# A tibble: 10 x 6
# Groups:   factor0, factor1 [20]
   factor0 factor1 value1_A value1_B value1.se_A value1.se_B
   <fct>   <fct>      <dbl>    <dbl>       <dbl>       <dbl>
 1 A       1              1        5         0.5        0.5 
 2 H       2              6        2         0.6        0.2 
 3 A       3              6        8         0.6        0.8 
 4 H       4             10       21         0.1        0.21
 5 A       5             30        5         0.3        0.5 
 6 H       6              3        5         0.3        0.5 
 7 A       7              4       50         0.4        1.5 
 8 H       8              4        7         1.4        1.7 
 9 A       9             15       48         1.5        0.48
10 H       10            20       21         2.1       21  
0 голосов
/ 24 сентября 2019

Используя data.table, мы можем сначала изменить значения factor2 в каждой группе и использовать dcast для приведения данных к длинному формату.

library(data.table)

setDT(sampledata)[, factor2 := factor(LETTERS[1:2]), .(factor0, factor1)]
dcast(sampledata, factor0 + factor1 ~ factor2, value.var = c("value1", "value1.se"))

#    factor0 factor1 value1_A value1_B value1.se_A value1.se_B
# 1:       A       1        1        5         0.5        0.50
# 2:       A       3        6        8         0.6        0.80
# 3:       A       5       30        5         0.3        0.50
# 4:       A       7        4       50         0.4        1.50
# 5:       A       9       15       48         1.5        0.48
# 6:       H      10       20       21         2.1       21.00
# 7:       H       2        6        2         0.6        0.20
# 8:       H       4       10       21         0.1        0.21
# 9:       H       6        3        5         0.3        0.50
#10:       H       8        4        7         1.4        1.70
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...