This is the type of structure I have. There is a few thousand rows in a data frame that has similar structure to the following:
vct_names <- c("apples", "apples", "grapes", "apples", "grapes")
vct_codes <- c(23, 35, 123, 43, 156)
df_values <- data.frame(names = vct_names, codes = vct_codes)
I want to convert the data frame above into a named list. I would like to iterate through each row of the data frame above and convert this data frame to a list. The list would have the following structure:
lst_values <- list()
lst_values$apples <- c(23, 35, 43)
lst_values$grapes <- c(123, 156)
Any ideas on an elegant way to solving this problem.
The split-function is precisely designed to do that. It works on both dataframes and on vectors as the first agument. It does this polymorphic act by being a generic function.
> methods(split)
[1] split.data.frame split.data.table* split.Date split.default
[5] split.IDate* split.POSIXct split.zoo*
see '?methods' for accessing help and source code
So this would be more economical:
> lst_values <- split(vct_codes, vct_names)
> lst_values
$apples
[1] 23 35 43
$grapes
[1] 123 156
In this case we are using split.default. Sometimes it's informative to print out the code, but in this case we only see some preliminary manipulation of edge cases before the data and arguments are passed to .Internal(split(seq_along(x), f)).
lapply(split(df_values, df_values$names), function(z) z[,2])
$apples
[1] 23 35 43
$grapes
[1] 123 156
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With