[R] Assign a list to one column of data frame
Marlin JL.M
marlin- at gmx.cn
Sun Dec 11 16:01:38 CET 2016
Dear Bert,
This is awesome, thanks a lot!
Best,
Marlin
On Sun, 2016-12-11 at 06:52 -0800, Bert Gunter wrote:
> Use list indexing, "[[" not "[" .
>
> > df <- data.frame(a=1:3,b=letters[1:3])
> > x <- "new"
> > df[[x]]<- I(list(1:5,g = "foo", abb = matrix(runif(6),nr=3)))
> > df
>
> a b new
> 1 1 a 1, 2, 3,....
> 2 2 b foo
> 3 3 c 0.248115....
> > df$new
>
> [[1]]
> [1] 1 2 3 4 5
>
> $g
> [1] "foo"
>
> $abb
> [,1] [,2]
> [1,] 0.2481156 0.2138564
> [2,] 0.8598658 0.2898058
> [3,] 0.5854885 0.4084578
>
>
> Cheers,
> Bert
>
>
> Bert Gunter
>
> "The trouble with having an open mind is that people keep coming
> along
> and sticking things into it."
> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
>
>
> On Sun, Dec 11, 2016 at 3:54 AM, Marlin JL.M <marlin- at gmx.cn> wrote:
> >
> > If you see my previous example, I have tried something like
> > > df[,n3] <- I(mylist)
> >
> > However, in my case, the name of the new column is in a variable
> > (by
> > user input) which can not be directly used by the dollar assign. On
> > the
> > other hand, "[<-" does not work correctly even if I wrap the list
> > into
> > "I()".
> >
> > Perhaps the title of my email is a little unclear, sorry for the
> > case.
> >
> > Best,
> > Marlin.
> >
> > On Sun, 2016-12-11 at 03:03 -0800, Bert Gunter wrote:
> > > ?data.frame says:
> > >
> > > "If a list or data frame or matrix is passed to data.frame it is
> > > as
> > > if
> > > each component or column had been passed as a separate argument
> > > (except for matrices of class "model.matrix" and those protected
> > > by
> > > I). "
> > >
> > > So doing what Help says to do seems to do what you asked:
> > >
> > >
> > > > df <- data.frame(a=1:3,b=letters[1:3])
> > > > df
> > >
> > > a b
> > > 1 1 a
> > > 2 2 b
> > > 3 3 c
> > >
> > > ## add a list column, protected by "I()"
> > > > df$new <- I(list(1:5,g = "foo", abb = matrix(runif(6),nr=3)))
> > >
> > > ## works as advertised
> > > > df
> > >
> > > a b new
> > > 1 1 a 1, 2, 3,....
> > > 2 2 b foo
> > > 3 3 c 0.080349....
> > >
> > > > df$new
> > >
> > > [[1]]
> > > [1] 1 2 3 4 5
> > >
> > > $g
> > > [1] "foo"
> > >
> > > $abb
> > > [,1] [,2]
> > > [1,] 0.08034915 0.83671591
> > > [2,] 0.43938440 0.06067429
> > > [3,] 0.88196881 0.33461234
> > >
> > >
> > > Cheers,
> > > Bert
> > >
> > >
> > > Bert Gunter
> > >
> > > "The trouble with having an open mind is that people keep coming
> > > along
> > > and sticking things into it."
> > > -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip
> > > )
> > >
> > >
> > > On Sat, Dec 10, 2016 at 7:18 PM, Marlin JL.M <marlin- at gmx.cn>
> > > wrote:
> > > > Dear all,
> > > >
> > > > I want to assign a list to one column of data.frame where the
> > > > name
> > > > of the column
> > > > is a variable. I tried the following:
> > > >
> > > > Using R version 3.3.2
> > > >
> > > > > df <- iris[1:3, ]
> > > > > df
> > > >
> > > > # Sepal.Length Sepal.Width Petal.Length Petal.Width Species
> > > > # 1 5.1 3.5 1.4 0.2 setosa
> > > > # 2 4.9 3.0 1.4 0.2 setosa
> > > > # 3 4.7 3.2 1.3 0.2 setosa
> > > >
> > > > > mylist <- list(c(1,2,3),c(1),c())
> > > > > mylist
> > > >
> > > > # [[1]]
> > > > # [1] 1 2 3
> > > > #
> > > > # [[2]]
> > > > # [1] 1
> > > > #
> > > > # [[3]]
> > > > # NULL
> > > >
> > > > > n1 <- 'new1'
> > > > > df$n1 <- mylist
> > > > > n2 <- 'new2'
> > > > > df[,n2] <- mylist
> > > >
> > > > # Warning message:
> > > > # In `[<-.data.frame`(`*tmp*`, , "new4", value = list(c(1, 2,
> > > > 3), :
> > > > # provided 3 variables to replace 1 variables
> > > >
> > > > > n3 <- 'new3'
> > > > > df[,n3] <- I(mylist)
> > > >
> > > > # Warning message:
> > > > # In `[<-.data.frame`(`*tmp*`, , "new3", value = list(c(1, 2,
> > > > 3), :
> > > > # provided 3 variables to replace 1 variables
> > > >
> > > > > eval(parse(text = paste0("df$","new4","<- mylist")))
> > > > > df
> > > >
> > > > # Sepal.Length Sepal.Width Petal.Length Petal.Width
> > > > Species n1
> > > > new2 new3 new4
> > > > # 1 5.1 3.5 1.4 0.2 setosa
> > > > 1, 2,
> > > > 3 1 1 1, 2, 3
> > > > #
> > > > 2 4.9 3.0 1.4 0.2 setosa
> > > > 1
> > > > 2 2 1
> > > > #
> > > > 3 4.7 3.2 1.3 0.2 setosa
> > > > NULL
> > > > 3 3 NULL
> > > >
> > > >
> > > > The "eval" works correctly, however, if I want to avoid using
> > > > "eval", what
> > > > should I do?
> > > >
> > > > Thanks!
> > > >
> > > > ______________________________________________
> > > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more,
> > > > see
> > > > https://stat.ethz.ch/mailman/listinfo/r-help
> > > > PLEASE do read the posting guide http://www.R-project.org/posti
> > > > ng-g
> > > > uide.html
> > > > and provide commented, minimal, self-contained, reproducible
> > > > code.
More information about the R-help
mailing list