Разделить фрейм данных на список, сохраняя значения столбцов в качестве имен вложенных списков

#r #dataframe #dplyr #data.table #tidyverse

#r #фрейм данных #dplyr #данные.таблица #tidyverse

Вопрос:

У меня есть следующее data frame , и я хочу сохранить значения первого столбца в качестве имен вложенных списков, а значения второго столбца — в качестве его элементов.

Ввод

 var <- c("a","b","c","d")
val <- c("0-1-2-NA","0-1","0-2-4","0-NA")
dt <- data.frame(var,val, stringsAsFactors = FALSE)

> dt
  var      val
1   a   0-1-2-NA
2   b      0-1
3   c    0-2-4
4   d     0-NA
  

Желаемый результат-

 $a
[1]  0  1  2 NA

$b
[1] 0 1

$c
[1] 0 2 4

$d
[1]  0 NA
  

Примечание — я также хочу split значения по - перед созданием списка.

Комментарии:

1. setNames(strsplit(dt$val, "-", TRUE), dt$var)

Ответ №1:

Базовое решение R с strsplit .

 dat <- strsplit(dt$val, split = "-")
names(dat) <- dt$var
dat
# $a
# [1] "0"  "1"  "2"  "NA"
# 
# $b
# [1] "0" "1"
# 
# $c
# [1] "0" "2" "4"
# 
# $d
# [1] "0"  "NA"
  

Чтобы автоматически преобразовать строки, добавьте type.convert (или as.integer или as.numeric ):

 res <- with(dt, lapply(strsplit(setNames(val, var), "-"), type.convert))
str(res)

# List of 4
#  $ a: int [1:4] 0 1 2 NA
#  $ b: int [1:2] 0 1
#  $ c: int [1:3] 0 2 4
#  $ d: int [1:2] 0 NA