[R] Assign a list to one column of data frame
Marlin JL.M
marlin- at gmx.cn
Sun Dec 11 12:54:27 CET 2016
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/posting-g
> > uide.html
> > and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list