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....
[[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
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)))
a b new
1 1 a 1, 2, 3,....
2 2 b foo
3 3 c 0.080349....
[[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
# 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!