Assign a list to one column of data frame
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.