[R] Fill NA values in columns with values of another column

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Fri Aug 30 01:11:16 CEST 2024


Dammit. Forgot all about that.

Yes, that is the way to do it:
with(dat,
     ave(Value, Group, FUN = \(x)min(x, na.rm = TRUE)))

Thanks for resolving my nonsense.

-- Bert

On Thu, Aug 29, 2024 at 2:58 PM Jeff Newmiller via R-help <
r-help using r-project.org> wrote:

> Use the ave function.
>
> On August 29, 2024 2:29:16 PM PDT, Bert Gunter <bgunter.4567 using gmail.com>
> wrote:
> >Petr et.al:
> >
> >I think using merge is a very nice idea! (note that the email omitted the
> >last rows of the result, though your code of course produced them)
> >
> >The only minor problem is that the order of the rows in the result is
> >changed from the original. If the OP needs to preserve the original
> >ordering, that can be easily done. Here is a complete implementation of
> >your idea (I think).
> >
> >## assume that dat is a data frame with the first two columns as in the
> >OP's post, i.e. the first column is the Value with NA's and the second is
> >the Group
> >
> > spl <-  dat |> nrow() |> seq_len() |> split(dat[[2]]) |> unlist() ## for
> >reordering
> > dat[spl, 1:2] <-
> >    dat[, 1:2] |>
> >    na.omit() |>  ## remove rows with NA's
> >    unique() |>  ## remove duplicate rows
> >    merge(dat[, 1:2], by.x=2, by.y=2) |> _[, 2:1]  ## and now merge()
> >
> > Note the final reordering of the first two columns because of the way
> >merge() works.
> >I suspect there may be a slicker way to do this using unsplit(), but I
> >could not figure out how
> >
> >The result is:
> >> dat
> >   Value Group
> >1      6     8
> >2      9     5
> >3      2     1
> >4      5     6
> >5      2     7
> >6      7     2
> >7      4     4
> >8      2     7
> >9      2     7
> >10    10     3
> >11     7     2
> >12     4     4
> >13     5     6
> >14     9     5
> >15     9     5
> >16     5     6
> >17    10     3
> >18     7     2
> >19     2     1
> >20     2     7
> >21     7     2
> >22     6     8
> >23     4     4
> >24     9     5
> >25     5     6
> >26     2     1
> >27     4     4
> >28     6     8
> >29    10     3
> >30    10     3
> >31     6     8
> >32     2     1
> >
> >Cheers,
> >Bert
> >
> >
> >
> >
> >On Wed, Aug 28, 2024 at 10:53 PM Petr Pikal <petr.pik using gmail.com> wrote:
> >
> >> Hallo Francesca
> >>
> >> If you had an object with correct setting, something like template
> >>
> >> > dput(res)
> >> structure(list(V1 = c("1", "2", "3", "4", "5", "6", "7", "8"),
> >>     V2 = c(2, 7, 10, 4, 9, 5, 2, 6)), class = "data.frame", row.names =
> >> c("1",
> >> "2", "3", "4", "5", "6", "7", "8"))
> >>
> >> you could merge it with your object where some values are missing
> >>
> >> > dput(daf)
> >> structure(list(X1 = c(6L, 9L, NA, 5L, NA, NA, 4L, 2L, 2L, NA,
> >> NA, NA, 5L, 9L, NA, NA, 10L, 7L, 2L, NA, 7L, NA, NA, NA, NA,
> >> 2L, 4L, 6L, 10L, NA, NA, NA), X2 = c(8L, 5L, 1L, 6L, 7L, 2L,
> >> 4L, 7L, 7L, 3L, 2L, 4L, 6L, 5L, 5L, 6L, 3L, 2L, 1L, 7L, 2L, 8L,
> >> 4L, 5L, 6L, 1L, 4L, 8L, 3L, 3L, 8L, 1L)), class = "data.frame",
> row.names =
> >> c(NA,
> >> -32L))
> >>
> >> > merge(daf, res, by.x="X2", by.y="V1")
> >>    X2 X1 V2
> >> 1   1 NA  2
> >> 2   1 NA  2
> >> 3   1  2  2
> >> 4   1  2  2
> >> 5   2 NA  7
> >> 6   2 NA  7
> >> 7   2  7  7
> >> 8   2  7  7
> >> 9   3 10 10
> >> 10  3 NA 10
> >> 11  3 10 10
> >> 12  3 NA 10
> >> 13  4  4  4
> >> 14  4 NA  4
> >> 15  4  4  4
> >> 16  4 NA  4
> >> 17  5  9  9
> >> 18  5 NA  9
> >> 19  5 NA  9
> >>
> >> Cheers.
> >> Petr
> >>
> >>
> >>
> >>
> >> st 28. 8. 2024 v 0:45 odesílatel Francesca PANCOTTO via R-help <
> >> r-help using r-project.org> napsal:
> >>
> >> > Dear Contributors,
> >> > I have a problem with a database composed of many individuals for many
> >> > periods, for which I need to perform a manipulation of data as
> follows.
> >> > Here I report the procedure I need to do for the first 32
> observations of
> >> > the first period.
> >> >
> >> >
> >> > cbind(VB1d[,1],s1id[,1])
> >> >       [,1] [,2]
> >> >  [1,]    6    8
> >> >  [2,]    9    5
> >> >  [3,]   NA    1
> >> >  [4,]    5    6
> >> >  [5,]   NA    7
> >> >  [6,]   NA    2
> >> >  [7,]    4    4
> >> >  [8,]    2    7
> >> >  [9,]    2    7
> >> > [10,]   NA    3
> >> > [11,]   NA    2
> >> > [12,]   NA    4
> >> > [13,]    5    6
> >> > [14,]    9    5
> >> > [15,]   NA    5
> >> > [16,]   NA    6
> >> > [17,]   10    3
> >> > [18,]    7    2
> >> > [19,]    2    1
> >> > [20,]   NA    7
> >> > [21,]    7    2
> >> > [22,]   NA    8
> >> > [23,]   NA    4
> >> > [24,]   NA    5
> >> > [25,]   NA    6
> >> > [26,]    2    1
> >> > [27,]    4    4
> >> > [28,]    6    8
> >> > [29,]   10    3
> >> > [30,]   NA    3
> >> > [31,]   NA    8
> >> > [32,]   NA    1
> >> >
> >> >
> >> > In column s1id, I have numbers from 1 to 8, which are the id of 8
> groups
> >> ,
> >> > randomly mixed in the larger group of 32.
> >> > For each group, I want the value that is reported for only to group
> >> > members, to all the four group members.
> >> >
> >> > For example, value 8 in first row , second column, is group 8. The
> value
> >> > for group 8 of the variable VB1d is 6. At row 28, again for s1id
> equal to
> >> > 8, I have 6.
> >> > But in row 22, the value 8 of the second variable, reports a value NA.
> >> > in each group is the same, only two values have the correct number,
> the
> >> > other two are NA.
> >> > I need that each group, identified by the values of the variable S1id,
> >> > correctly report the number of variable VB1d that is present for just
> two
> >> > group members.
> >> >
> >> > I hope my explanation is acceptable.
> >> > The task appears complex to me right now, especially because I will
> need
> >> to
> >> > multiply this procedure for x12x14 similar databases.
> >> >
> >> > Anyone has ever encountered a similar problem?
> >> > Thanks in advance for any help provided.
> >> >
> >> > ----------------------------------
> >> >
> >> > Francesca Pancotto
> >> >
> >> > Associate Professor Political Economy
> >> >
> >> > University of Modena, Largo Santa Eufemia, 19, Modena
> >> >
> >> > Office Phone: +39 0522 523264
> >> >
> >> > Web: *https://sites.google.com/view/francescapancotto/home
> >> > <https://sites.google.com/view/francescapancotto/home>*
> >> >
> >> >  ----------------------------------
> >> >
> >> >         [[alternative HTML version deleted]]
> >> >
> >> > ______________________________________________
> >> > R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >> > https://stat.ethz.ch/mailman/listinfo/r-help
> >> > PLEASE do read the posting guide
> >> > https://www.R-project.org/posting-guide.html
> >> > and provide commented, minimal, self-contained, reproducible code.
> >> >
> >>
> >>         [[alternative HTML version deleted]]
> >>
> >> ______________________________________________
> >> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >> https://stat.ethz.ch/mailman/listinfo/r-help
> >> PLEASE do read the posting guide
> >> https://www.R-project.org/posting-guide.html
> >> and provide commented, minimal, self-contained, reproducible code.
> >>
> >
> >       [[alternative HTML version deleted]]
> >
> >______________________________________________
> >R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >https://stat.ethz.ch/mailman/listinfo/r-help
> >PLEASE do read the posting guide
> https://www.R-project.org/posting-guide.html
> >and provide commented, minimal, self-contained, reproducible code.
>
> --
> Sent from my phone. Please excuse my brevity.
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list