разбить список объектов разного размера с символами и числами в таблицу в R - PullRequest
1 голос
/ 24 октября 2019

У меня есть список в R, подобный этому, с разным количеством элементов в любом случае.

[[1]]
[1] "nucl 21.5"     " cyto_nucl 14" " cyto 5.5"    

[[2]]
[1] "plas 25"

[[3]]
[1] "mito 9"  " plas 9" " E.R. 5" " golg 2" " vacu 2"

[[4]]
 [1] "mito 9"         " cyto 5.5"      " cyto_nucl 5.5" " nucl 4.5"      " extr 2"        " pero 2"        " golg 2"  

Я хочу разбить это на фрейм данных и быть таким:

 V1   V2        V3   V4       V5  V6   V7  V8   V9 V10  V11 V12  V13 V14
nucl 21.5 cyto_nucl 14.0     cyto 5.5      NA       NA       NA       NA
plas 25.0            NA           NA       NA       NA       NA       NA
mito  9.0      plas  9.0     E.R. 5.0 golg 2.0 vacu   2      NA       NA
mito  9.0      cyto  5.5 cyto_nuc 5.5 nucl 4.5 extr   2 pero   2 glog   2

1 Ответ

2 голосов
/ 24 октября 2019

Используя dplyr, вы можете сделать это:

library(dplyr)
df <- lapply(l, function(x) as.data.frame(t(x), stringsAsFactors = FALSE)) %>% 
  bind_rows()

df
#>          V1            V2             V3        V4      V5      V6      V7
#> 1 nucl 21.5  cyto_nucl 14       cyto 5.5      <NA>    <NA>    <NA>    <NA>
#> 2   plas 25          <NA>           <NA>      <NA>    <NA>    <NA>    <NA>
#> 3    mito 9        plas 9         E.R. 5    golg 2  vacu 2    <NA>    <NA>
#> 4    mito 9      cyto 5.5  cyto_nucl 5.5  nucl 4.5  extr 2  pero 2  golg 2

Или, если вы хотите разделить строки, в которых есть пробелы:

df <- lapply(l, function(x) {
  x <- unlist(strsplit(x, " "))
  x <- x[x != ""]
  as.data.frame(t(x), stringsAsFactors = FALSE)
}) %>% 
  bind_rows()

df
#>     V1   V2        V3   V4        V5   V6   V7   V8   V9  V10  V11  V12
#> 1 nucl 21.5 cyto_nucl   14      cyto  5.5 <NA> <NA> <NA> <NA> <NA> <NA>
#> 2 plas   25      <NA> <NA>      <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 3 mito    9      plas    9      E.R.    5 golg    2 vacu    2 <NA> <NA>
#> 4 mito    9      cyto  5.5 cyto_nucl  5.5 nucl  4.5 extr    2 pero    2
#>    V13  V14
#> 1 <NA> <NA>
#> 2 <NA> <NA>
#> 3 <NA> <NA>
#> 4 golg    2

data

l <- list(
  c("nucl 21.5",     " cyto_nucl 14", " cyto 5.5"    ),
  "plas 25",
  c("mito 9",  " plas 9", " E.R. 5", " golg 2", " vacu 2"),
  c("mito 9",         " cyto 5.5",      " cyto_nucl 5.5", " nucl 4.5",      " extr 2",        " pero 2",        " golg 2")
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...