[R] Assign a list to one column of data frame

Bert Gunter bgunter.4567 at gmail.com
Sun Dec 11 12:03:45 CET 2016


?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-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list