[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