Конвертировать фрейм данных в список в R - PullRequest
3 голосов
/ 29 октября 2019

Я хотел бы преобразовать фрейм данных в список. См. Ввод в Таблице 1. См. Вывод в Таблице 2. Когда вы открываете список в R из среды. Имя - следующие имена clus1, clus2 ... Type - должны содержать значения из столбца V1 Value - список длиной 3

Table 1
      V1 V2 V3
clus1 10 a  d
clus2 20 b  e
clus3 5  c  f

Table 2
$`clus1`
[1] "a"  "d" 

$`clus2`
[2] "b"  "e" 

$`clus3`
[2] "c"  "f"

Ответы [ 2 ]

7 голосов
/ 29 октября 2019
t1 = read.table(text = "      V1 V2 V3
clus1 10 a  d
clus2 20 b  e
clus3 5  c  ''", header = T)

result = split(t1[, 2:3], f = row.names(t1))
result = lapply(result, function(x) {
  x = as.character(unname(unlist(x)))
  x[x != '']})
result
# $clus1
# [1] "a" "d"
# 
# $clus2
# [1] "b" "e"
# 
# $clus3
# [1] "c"

В этом конкретном случае мы можем пойти немного дальше, если сначала преобразуем в матрицу:

r2 = split(as.matrix(t1[, 2:3]), f = row.names(t1))
r2 = lapply(r2, function(x) x[x != ''])
# same result
2 голосов
/ 29 октября 2019

Вы можете подумать об этом как о задаче изменения формы, чтобы масштабировать ее для нескольких столбцов, то есть создавать столбец значений, а не отслеживать все, что вы работаете со столбцами V2 и V3. Таким образом, вы можете сделать это за один проход с некоторыми основными функциями обратного хода. Это также позволяет легко фильтровать данные перед составлением списка, основываясь на удалении пробелов или любых других условиях, опять же без указания столбцов.

library(dplyr)

# thanks @Gregor for filling in the data
tibble::rownames_to_column(t1, var = "clust") %>%
  select(-V1) %>%
  tidyr::gather(key, value, -clust) %>%
  filter(value != "") %>%
  split(.$clust) %>%
  purrr::map("value")
#> $clus1
#> [1] "a" "d"
#> 
#> $clus2
#> [1] "b" "e"
#> 
#> $clus3
#> [1] "c"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...