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.
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))) > dfa 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/posting-g >> > uide.html >> > and provide commented, minimal, self-contained, reproducible code.
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.