'how restructure data by composite value as a percentage in R

Sample of my dataset

tree=structure(list(vyd = c(108L, 108L, 108L, 108L, 108L, 108L, 108L, 
108L, 108L, 108L, 108L, 108L, 108L), date = c("08.01.2018", "08.01.2018", 
"08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", 
"08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", 
"08.01.2018"), row = c(3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 
5L, 5L, 5L), col = c(25L, 26L, 27L, 28L, 25L, 26L, 27L, 28L, 
29L, 30L, 25L, 26L, 27L), B1 = c(10987, 10987, 10987, 10987, 
11077, 11077, 11077, 11077, 10802, 10802, 11077, 11077, 11077
), B2 = c(10368, 10336, 10400, 10472, 10272, 10312, 10368, 10408, 
10296, 10208, 10192, 10216, 10344), B3 = c(9584, 9496, 9520, 
9456, 9520, 9520, 9496, 9384, 9528, 9304, 9624, 9568, 9464), 
    B4 = c(10136, 9920, 9904, 9936, 10000, 9792, 9824, 9896, 
    9712, 9592, 9904, 9904, 9856), B5 = c(10463, 10463, 10472, 
    10472, 10471, 10471, 10359, 10359, 10162, 9978, 10471, 10471, 
    10359), B6 = c(10173, 10173, 9980, 9980, 10114, 10114, 10036, 
    10036, 9866, 9553, 10114, 10114, 10036), B7 = c(9886, 9886, 
    9733, 9733, 9851, 9851, 9703, 9703, 9504, 9266, 9851, 9851, 
    9703), B8 = c(10456, 10416, 10528, 10416, 10432, 10576, 10592, 
    10384, 10432, 10184, 10528, 10664, 10592), B8A = c(9814, 
    9814, 9592, 9592, 9796, 9796, 9598, 9598, 9283, 9017, 9796, 
    9796, 9598), B9 = c(13463, 13463, 13463, 13463, 13689, 13689, 
    13689, 13689, 13254, 13254, 13689, 13689, 13689), B10 = c(7416, 
    7416, 7323, 7323, 7373, 7373, 7271, 7271, 7072, 6961, 7373, 
    7373, 7271), B11 = c(6244, 6244, 6057, 6057, 6148, 6148, 
    6003, 6003, 5790, 5742, 6148, 6148, 6003), B12 = c(1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), Y = c("5E3C2B+OC", "5E3C2B+OC", 
    "5E3C2B+OC", "5E3C2B+OC", "5E3C2B+OC", "5E3C2B+OC", "5E3C2B+OC", 
    "5E3C2B+OC", "5E3C2B+OC", "5E3C2B+OC", "5E3C2B+OC", "5E3C2B+OC", 
    "5E3C2B+OC")), class = "data.frame", row.names = c(NA, -13L
))

Here Y variable has composite value , for example 5E3C2B+OC.

How to restructure the data so that for each composite value there is the same separate dataset, and the composite value itself becomes a percentage?

for example here 5E,3C,2B (Everything after the plus, we never touch ) 5E=50%E ,3C=30%C, 2B=20%.

Thus, this dataset should be duplicated three times, where two new columns are added together - the letter component and its percentage component. well, for example, it would look like this (slightly shortened for clarity ).

vyd date    row col B1  B2  B3  B4  B5  B6  B7  B8  B8A B9  B10 B11 B12 Y   Letter  perc
108 08.01.2018  3   25  10987.0 10368.0 9584.0  10136.0 10463.0 10173.0 9886.0  10456.0 9814.0  13463.0 7416.0  6244.0  1.0 5Е3С2B+ОС   E   50
108 08.01.2018  3   26  10987.0 10336.0 9496.0  9920.0  10463.0 10173.0 9886.0  10416.0 9814.0  13463.0 7416.0  6244.0  1.0 5Е3С2B+ОС   E   50
    ……………………………………………………………………………………………………………………………………………………………………………………………………………………………….                               ….. NNN                                 
108 08.01.2018  3   25  10987.0 10368.0 9584.0  10136.0 10463.0 10173.0 9886.0  10456.0 9814.0  13463.0 7416.0  6244.0  1.0 5Е3С2B+ОС   C   30
108 08.01.2018  3   26  10987.0 10336.0 9496.0  9920.0  10463.0 10173.0 9886.0  10416.0 9814.0  13463.0 7416.0  6244.0  1.0 5Е3С2B+ОС   C   30
    ……………………………………………………………………………………………………………………………………………………………………………………………………………………………….                               ….. NNN                                 
108 08.01.2018  3   25  10987.0 10368.0 9584.0  10136.0 10463.0 10173.0 9886.0  10456.0 9814.0  13463.0 7416.0  6244.0  1.0 5Е3С2B+ОС   B   20
108 08.01.2018  3   26  10987.0 10336.0 9496.0  9920.0  10463.0 10173.0 9886.0  10416.0 9814.0  13463.0 7416.0  6244.0  1.0 5Е3С2B+ОС   B   20

or desired result via dput()

Desired_result=structure(list(vyd = c(108L, 108L, 108L, 108L, 108L, 108L, 108L, 
108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 
108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 
108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L), 
    date = c("08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", 
    "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", 
    "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", 
    "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", 
    "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", 
    "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", 
    "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", 
    "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018", "08.01.2018"
    ), row = c(3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 
    5L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 3L, 
    3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L), col = c(25L, 
    26L, 27L, 28L, 25L, 26L, 27L, 28L, 29L, 30L, 25L, 26L, 27L, 
    25L, 26L, 27L, 28L, 25L, 26L, 27L, 28L, 29L, 30L, 25L, 26L, 
    27L, 25L, 26L, 27L, 28L, 25L, 26L, 27L, 28L, 29L, 30L, 25L, 
    26L, 27L), B1 = c(10987, 10987, 10987, 10987, 11077, 11077, 
    11077, 11077, 10802, 10802, 11077, 11077, 11077, 10987, 10987, 
    10987, 10987, 11077, 11077, 11077, 11077, 10802, 10802, 11077, 
    11077, 11077, 10987, 10987, 10987, 10987, 11077, 11077, 11077, 
    11077, 10802, 10802, 11077, 11077, 11077), B2 = c(10368, 
    10336, 10400, 10472, 10272, 10312, 10368, 10408, 10296, 10208, 
    10192, 10216, 10344, 10368, 10336, 10400, 10472, 10272, 10312, 
    10368, 10408, 10296, 10208, 10192, 10216, 10344, 10368, 10336, 
    10400, 10472, 10272, 10312, 10368, 10408, 10296, 10208, 10192, 
    10216, 10344), B3 = c(9584, 9496, 9520, 9456, 9520, 9520, 
    9496, 9384, 9528, 9304, 9624, 9568, 9464, 9584, 9496, 9520, 
    9456, 9520, 9520, 9496, 9384, 9528, 9304, 9624, 9568, 9464, 
    9584, 9496, 9520, 9456, 9520, 9520, 9496, 9384, 9528, 9304, 
    9624, 9568, 9464), B4 = c(10136, 9920, 9904, 9936, 10000, 
    9792, 9824, 9896, 9712, 9592, 9904, 9904, 9856, 10136, 9920, 
    9904, 9936, 10000, 9792, 9824, 9896, 9712, 9592, 9904, 9904, 
    9856, 10136, 9920, 9904, 9936, 10000, 9792, 9824, 9896, 9712, 
    9592, 9904, 9904, 9856), B5 = c(10463, 10463, 10472, 10472, 
    10471, 10471, 10359, 10359, 10162, 9978, 10471, 10471, 10359, 
    10463, 10463, 10472, 10472, 10471, 10471, 10359, 10359, 10162, 
    9978, 10471, 10471, 10359, 10463, 10463, 10472, 10472, 10471, 
    10471, 10359, 10359, 10162, 9978, 10471, 10471, 10359), B6 = c(10173, 
    10173, 9980, 9980, 10114, 10114, 10036, 10036, 9866, 9553, 
    10114, 10114, 10036, 10173, 10173, 9980, 9980, 10114, 10114, 
    10036, 10036, 9866, 9553, 10114, 10114, 10036, 10173, 10173, 
    9980, 9980, 10114, 10114, 10036, 10036, 9866, 9553, 10114, 
    10114, 10036), B7 = c(9886, 9886, 9733, 9733, 9851, 9851, 
    9703, 9703, 9504, 9266, 9851, 9851, 9703, 9886, 9886, 9733, 
    9733, 9851, 9851, 9703, 9703, 9504, 9266, 9851, 9851, 9703, 
    9886, 9886, 9733, 9733, 9851, 9851, 9703, 9703, 9504, 9266, 
    9851, 9851, 9703), B8 = c(10456, 10416, 10528, 10416, 10432, 
    10576, 10592, 10384, 10432, 10184, 10528, 10664, 10592, 10456, 
    10416, 10528, 10416, 10432, 10576, 10592, 10384, 10432, 10184, 
    10528, 10664, 10592, 10456, 10416, 10528, 10416, 10432, 10576, 
    10592, 10384, 10432, 10184, 10528, 10664, 10592), B8A = c(9814, 
    9814, 9592, 9592, 9796, 9796, 9598, 9598, 9283, 9017, 9796, 
    9796, 9598, 9814, 9814, 9592, 9592, 9796, 9796, 9598, 9598, 
    9283, 9017, 9796, 9796, 9598, 9814, 9814, 9592, 9592, 9796, 
    9796, 9598, 9598, 9283, 9017, 9796, 9796, 9598), B9 = c(13463, 
    13463, 13463, 13463, 13689, 13689, 13689, 13689, 13254, 13254, 
    13689, 13689, 13689, 13463, 13463, 13463, 13463, 13689, 13689, 
    13689, 13689, 13254, 13254, 13689, 13689, 13689, 13463, 13463, 
    13463, 13463, 13689, 13689, 13689, 13689, 13254, 13254, 13689, 
    13689, 13689), B10 = c(7416, 7416, 7323, 7323, 7373, 7373, 
    7271, 7271, 7072, 6961, 7373, 7373, 7271, 7416, 7416, 7323, 
    7323, 7373, 7373, 7271, 7271, 7072, 6961, 7373, 7373, 7271, 
    7416, 7416, 7323, 7323, 7373, 7373, 7271, 7271, 7072, 6961, 
    7373, 7373, 7271), B11 = c(6244, 6244, 6057, 6057, 6148, 
    6148, 6003, 6003, 5790, 5742, 6148, 6148, 6003, 6244, 6244, 
    6057, 6057, 6148, 6148, 6003, 6003, 5790, 5742, 6148, 6148, 
    6003, 6244, 6244, 6057, 6057, 6148, 6148, 6003, 6003, 5790, 
    5742, 6148, 6148, 6003), B12 = c(1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), Y = c("5E3C2B", "5E3C2B", 
    "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", 
    "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", 
    "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", 
    "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", 
    "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", 
    "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", "5E3C2B", 
    "5E3C2B"), Letter = c("E", "E", "E", "E", "E", "E", "E", 
    "E", "E", "E", "E", "E", "E", "C", "C", "C", "C", "C", "C", 
    "C", "C", "C", "C", "C", "C", "C", "B", "B", "B", "B", "B", 
    "B", "B", "B", "B", "B", "B", "B", "B"), perc = c(50L, 50L, 
    50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 30L, 
    30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 
    20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 
    20L)), class = "data.frame", row.names = c(NA, -39L))

If there are any other rows with other composite values, do the same for them. For example, if rows appeared where Y in 4o6b, then two columns of letter O= 40% and B=60% will appear according to the same principle as I described above. (I.E 2 times the dataset is duplicated With different letters )

How to do such reformation of data. Thank you for your help



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source