Как изменить структуру данных из длинных в широкие по нескольким переменным? - PullRequest
1 голос
/ 01 апреля 2020

This is an image of my dataset after following a users suggestion, it corresponds to follow up 1. У меня есть набор данных, который выглядит примерно так, за исключением очень длинного:

 treatment  biomass greenness height    NDVI
1 Apigenin 0.001 221694.0   0.15028 92.647 0.21001
2 Apigenin 0.001  72639.6   0.22868 90.435 0.22735
3 Apigenin 0.001 232935.0   0.19238 84.684 0.29084
4 Apigenin 0.001 199267.0   0.23515 95.618 0.28140
5 Apigenin 0.001 213989.0   0.21403 86.819 0.31824
6 Apigenin 0.001 143787.0   0.19836 99.779 0.25108

Я хотел бы преобразовать его в формат, чтобы получить 4 разных кадра данных - 1 кадр данных / независимый vairbale (биомасса данных, greennessdata, heightdata, NDVIdata), каждая обработка которых представлена ​​в виде столбца, а значения измерения - как измерения.

Это то, что я сделал - я в основном разбил набор данных сначала на отдельные фреймы данных, а затем попытался распространить оба. Это не сработало - я не могу заставить его рассматривать все те же повторяющиеся обработки как 1.

Я хочу, чтобы все значения биомассы для всех апигенинов 0,001 (6 различных значений биомассы) были помещены в «Апигенин 0,001» столбец.

 biomassdata <- data[c(1,2)]
 head(biomassdata)

treatment  biomass
1 Apigenin 0.001 221694.0
2 Apigenin 0.001  72639.6
3 Apigenin 0.001 232935.0
4 Apigenin 0.001 199267.0
5 Apigenin 0.001 213989.0
6 Apigenin 0.001 143787.0

data_wide <- spread(data, treatment, biomass)

**my error**

Error: Each row of output must be identified by a unique combination of keys.
Keys are shared for 24 rows:
* 61, 63, 64, 66, 67, 68, 69, 71, 72, 73, 74, 75, 77, 78, 79, 80, 82, 83, 84, 85, 86, 88, 89, 90

Пожалуйста, помогите! Заранее спасибо :)

Продолжение 1: Я предложил nurandi и добавил столбец идентификаторов + запустил то, что они написали, и я получил подобный фрагмент данных, подобный этому. Даже после использования na.omit я не могу избавиться от АН. Как я могу свернуть это так, чтобы все данные в виде 6 строк по x столбцам df?

Продолжение 2: Вот мои данные с dput (data)

structure(list(treatment = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 
7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 
10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 
12L, 12L, 12L, 13L, 13L, 13L, 13L, 13L, 13L, 14L, 14L, 14L, 14L, 
14L, 14L, 15L, 15L, 15L, 15L, 15L, 15L, 16L, 16L, 16L, 16L, 16L, 
16L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 
18L, 18L, 18L, 18L, 18L, 18L, 19L, 19L, 19L, 19L, 19L, 19L, 20L, 
20L, 20L, 20L, 20L, 20L, 21L, 21L, 21L, 21L, 21L, 21L, 22L, 22L, 
22L, 22L, 22L, 22L), .Label = c("Apigenin 0.001", "Apigenin 0.01", 
"Apigenin 0.1", "Apigenin 1", "Apigenin 10", "Arbutin 0.001", 
"Arbutin 0.01", "Arbutin 0.1", "Arbutin 1", "Arbutin 10", "blank", 
"Catechin 0.001", "Catechin 0.01", "Catechin 0.1", "Catechin 1", 
"Catechin 10", "Control 0", "Epicatechin 0.001", "Epicatechin 0.01", 
"Epicatechin 0.1", "Epicatechin 1", "Epicatechin 10"), class = "factor"), 
    ID = 1:162, biomass = c(221694, 72639.6, 232935, 199267, 
    213989, 143787, 108455, 147839, 252471, 142101, 119912, 227052, 
    178779, 43711.7, 276519, 176843, 159333, 154074, 59773.9, 
    59487.9, 88314.4, 93913, 216126, 179190, 204302, 290455, 
    121592, 132088, 135095, 184920, 142149, 163629, 148910, 93512.5, 
    27448.5, 89122.8, 121462, 122664, 113559, 175693, 156794, 
    152504, 253416, 151476, 296591, 204390, 350047, 280300, 245592, 
    131444, 209276, 156653, 187770, 135809, 115277, 158624, 171040, 
    146898, 204402, 69558.6, 0, 13606.8, 0, 0, 95.986, 0, 0, 
    0, 0, 10117.6, 0, 0, 0, 0, 0, 390.35, 0, 0, 0, 0, 4551.37, 
    0, 0, 0, 0, 0, 62.509, 0, 0, 0, 191794, 144348, 156837, 133628, 
    100955, 141259, 194590, 88728.2, 254885, 217073, 149569, 
    140578, 239332, 123793, 117182, 128033, 288146, 124335, 50298.3, 
    58042, 271309, 76837.5, 64283.4, 39683.5, 143766, 246305, 
    222373, 104302, 135446, 211847, 170214, 167940, 190325, 266613, 
    154118, 161985, 212837, 107061, 251746, 174159, 221187, 92178, 
    259297, 127482, 284857, 108563, 277292, 122333, 327831, 198009, 
    225756, 204637, 223356, 196766, 117736, 160845, 263906, 132815, 
    443663, 157005, 190361, 176090, 215908, 203894, 171227, 201593, 
    146864, 130770, 99702.7, 228162, 202906, 233314), greenness = c(0.15028, 
    0.22868, 0.19238, 0.23515, 0.21403, 0.19836, 0.2237, 0.17761, 
    0.23665, 0.24452, 0.2126, 0.20856, 0.1506, 0.23842, 0.16838, 
    0.20856, 0.19131, 0.21226, 0.21069, 0.13162, 0.22843, 0.18827, 
    0.2189, 0.20778, 0.17662, 0.23778, 0.14829, 0.19675, 0.19279, 
    0.20615, 0.16436, 0.19543, 0.19704, 0.20855, 0.13348, 0.23248, 
    0.19071, 0.2136, 0.20921, 0.17778, 0.19822, 0.21325, 0.16728, 
    0.25961, 0.17343, 0.20308, 0.17734, 0.242, 0.22057, 0.16954, 
    0.19165, 0.1845, 0.17033, 0.20429, 0.16552, 0.25312, 0.19969, 
    0.21126, 0.21567, 0.20092, 0, 0.15785, 0, 0, 0.06892, 0, 
    0, 0, 0, 0.18583, 0, 0, 0, 0, 0, 0.04699, 0, 0, 0, 0, 0.18747, 
    0, 0, 0, 0, 0, 0.03289, 0, 0, 0, 0.1896, 0.27279, 0.16916, 
    0.2194, 0.19494, 0.20371, 0.24688, 0.2282, 0.22256, 0.21988, 
    0.22612, 0.20273, 0.21205, 0.2467, 0.17265, 0.25261, 0.20605, 
    0.24522, 0.23485, 0.20824, 0.21689, 0.20503, 0.21646, 0.19256, 
    0.18349, 0.25014, 0.21185, 0.21199, 0.19043, 0.22531, 0.19896, 
    0.23486, 0.20735, 0.20261, 0.17726, 0.22984, 0.23568, 0.21472, 
    0.20697, 0.2529, 0.23796, 0.17527, 0.1892, 0.21681, 0.17071, 
    0.2288, 0.2082, 0.24332, 0.21457, 0.19615, 0.22709, 0.2089, 
    0.21144, 0.25504, 0.17523, 0.21035, 0.19321, 0.24167, 0.21131, 
    0.2185, 0.20862, 0.19959, 0.20922, 0.25067, 0.23803, 0.21703, 
    0.20565, 0.23583, 0.21409, 0.22438, 0.19036, 0.23628), height = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), NDVI = c(65.077, 
    71.607, 62.782, 74.981, 67.432, 80.255, 67.415, 59.571, 67.783, 
    70.877, 64.327, 72.559, 60.308, 50.861, 65.375, 62.926, 70.161, 
    76.615, 64.328, 71.278, 57.754, 61.734, 66.04, 57.962, 56.844, 
    70.889, 58.485, 65.606, 61.301, 66.876, 47.079, 73.912, 80.114, 
    59.559, 49.89, 29.104, 60.602, 70.481, 66.94, 72.538, 64.116, 
    60.579, 66.579, 52.237, 71.65, 74.068, 70.205, 61.413, 69.771, 
    65.47, 61.813, 64.855, 73.321, 58.804, 70.393, 57.986, 60.365, 
    69.463, 61.317, 45.124, 0, 63.492, 0, 0, 0.3, 0, 0, 0, 0, 
    29.118, 0, 0, 0, 0, 0, 0.838, 0, 0, 0, 0, 7.232, 0, 0, 0, 
    0, 0, 0.4, 0, 0, 0, 67.73, 65.52, 57.589, 65.524, 60.692, 
    75.595, 71.817, 61.508, 72.19, 75.911, 56.581, 63.549, 69.393, 
    63.835, 57.988, 43.169, 71.803, 54.076, 33.243, 77.246, 70.999, 
    58.495, 47.994, 51.257, 70.875, 63.179, 77.211, 63.353, 49.996, 
    72.651, 50.371, 60.6, 66.92, 72.503, 57.064, 52.697, 58.914, 
    59.243, 52.637, 55.861, 68.979, 73.941, 62.623, 72.005, 80.262, 
    41.771, 69.721, 64.639, 81.986, 87.598, 58.017, 66.916, 74.297, 
    71.967, 65.933, 70.657, 60.856, 52.216, 68.772, 69.043, 59.239, 
    69.204, 65.91, 83.655, 62.093, 61.576, 55.245, 56.44, 74.885, 
    70.636, 63.449, 68.166)), row.names = c(NA, -162L), class = "data.frame")

Вот dput (head (data, 5))

structure(list(treatment = structure(c(1L, 1L, 1L, 1L, 1L), .Label = c("Apigenin 0.001", 
"Apigenin 0.01", "Apigenin 0.1", "Apigenin 1", "Apigenin 10", 
"Arbutin 0.001", "Arbutin 0.01", "Arbutin 0.1", "Arbutin 1", 
"Arbutin 10", "blank", "Catechin 0.001", "Catechin 0.01", "Catechin 0.1", 
"Catechin 1", "Catechin 10", "Control 0", "Epicatechin 0.001", 
"Epicatechin 0.01", "Epicatechin 0.1", "Epicatechin 1", "Epicatechin 10"
), class = "factor"), ID = 1:5, biomass = c(221694, 72639.6, 
232935, 199267, 213989), greenness = c(0.15028, 0.22868, 0.19238, 
0.23515, 0.21403), height = c(0L, 0L, 0L, 0L, 0L), NDVI = c(65.077, 
71.607, 62.782, 74.981, 67.432)), row.names = c(NA, 5L), class = "data.frame")

Вот dput (head (biomassdata, 5))

structure(list(treatment = structure(c(1L, 1L, 1L, 1L, 1L), .Label = c("Apigenin 0.001", 
"Apigenin 0.01", "Apigenin 0.1", "Apigenin 1", "Apigenin 10", 
"Arbutin 0.001", "Arbutin 0.01", "Arbutin 0.1", "Arbutin 1", 
"Arbutin 10", "blank", "Catechin 0.001", "Catechin 0.01", "Catechin 0.1", 
"Catechin 1", "Catechin 10", "Control 0", "Epicatechin 0.001", 
"Epicatechin 0.01", "Epicatechin 0.1", "Epicatechin 1", "Epicatechin 10"
), class = "factor"), ID = 1:5), row.names = c(NA, 5L), class = "data.frame")

Мой ожидаемый вывод похож на скриншот, за исключением того, что он свернут (т.е. нет Н / Д значения.) Аналогично: апигенин 0,001 <- c (x, y, z, w, s, f) апигенин 0,01 <- c (г, ч, j, u, t, d) et c. где буквы разных наблюдений биомассы. </p>

1 Ответ

0 голосов
/ 01 апреля 2020

С tidyr руководство:

Разработка на spread() завершена, и для нового кода мы рекомендуем переключиться на pivot_wider(), что проще в использовании, более функционально и все еще находится под активное развитие.

Для преобразования длинного в широкий формат вашему фрейму данных необходим один или несколько идентификаторов. Это мое предложение с использованием измененных данных (я добавил в него идентификатор).

library(tidyr)

biomass_data <- df %>% 
   pivot_wider(id_cols = "ID", names_from = "treatment", values_from = "biomass")

biomass_data

# # A tibble: 3 x 3
#      ID Apigenin1 Apigenin2
#   <dbl>     <dbl>     <dbl>
# 1     1     0.001     0.001
# 2     2     0.001     0.001
# 3     3     0.001     0.001


greenness_data <- df %>% 
   pivot_wider(id_cols = "ID", names_from = "treatment", values_from = "greenness")

greenness_data

# # A tibble: 3 x 3
#      ID Apigenin1 Apigenin2
#   <dbl>     <dbl>     <dbl>
# 1     1    221694    72640.
# 2     2    232935   199267 
# 3     3    213989   143787 
...