Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

creating a data.frame whose column will hold a list in each row [duplicate]

Tags:

r

I can't create a data frame with a column made of a collection of characters.

Is it not possible / should I stick with lists ?

>subsets <- c(list("a","d","e"),list("a","b","c","e"))
customerids <- c(1,1)
transactions <- data.frame(customerid = customerids,subset =subsets)
> str(transactions)
'data.frame':   2 obs. of  8 variables:
 $ customerid  : num  1 1
 $ subset..a.  : Factor w/ 1 level "a": 1 1
 $ subset..d.  : Factor w/ 1 level "d": 1 1
 $ subset..e.  : Factor w/ 1 level "e": 1 1
 $ subset..a..1: Factor w/ 1 level "a": 1 1
 $ subset..b.  : Factor w/ 1 level "b": 1 1
 $ subset..c.  : Factor w/ 1 level "c": 1 1
 $ subset..e..1: Factor w/ 1 level "e": 1 1
like image 426
nicolas Avatar asked Mar 24 '23 04:03

nicolas


2 Answers

I think you've written subsets wrongly. If it is in fact this:

subsets <- list(c("a", "d", "e"), c("a", "b", "c", "e"))
# [[1]]
# [1] "a" "d" "e"

# [[2]]
# [1] "a" "b" "c" "e"

And customerids is c(1,1), then you can have subsets as a list in a column of data.frame as the total number of rows will still be the same. You can do it as follows:

DF <- data.frame(id = customerids, value = I(subsets))
#   id      value
# 1  1    a, d, e
# 2  1 a, b, c, e

sapply(DF, class)
#        id     value 
# "numeric"    "AsIs" 

Now you can access DF$value and perform operations as you would on a list.

like image 60
Arun Avatar answered Apr 06 '23 01:04

Arun


Use data.table instead:

library(data.table)

# note the extra list here
subsets <- list(list("a","d","e"),list("a","b","c","e"))
customerids <- c(1,1)

transactions <- data.table(customerid = customerids, subset = subsets)
str(transactions)
#Classes ‘data.table’ and 'data.frame':  2 obs. of  2 variables:
# $ customerid: num  1 1
# $ subset    :List of 2
#  ..$ :List of 3
#  .. ..$ : chr "a"
#  .. ..$ : chr "d"
#  .. ..$ : chr "e"
#  ..$ :List of 4
#  .. ..$ : chr "a"
#  .. ..$ : chr "b"
#  .. ..$ : chr "c"
#  .. ..$ : chr "e"
# - attr(*, ".internal.selfref")=<externalptr> 

transactions
#   customerid subset
#1:          1 <list>
#2:          1 <list>
like image 41
eddi Avatar answered Apr 06 '23 00:04

eddi