Jak číst csv. soubory s vektory v datech.tabulka balíček?

0

Otázka

Vytvořil jsem tibble (jménem df) s číslem a vektor uvnitř:

library(tsibble)
library(data.table)

df <- tibble(var1 = 5, var2 = list(c(1,2,3)))

var1   var2
 5   c(1,2,3)

Pak jsem zachránil to tibble jako csv. soubor jako tak:

data.table::fwrite(df, file = "C/MyFolder/file.csv")

Nyní chci, aby tento soubor číst:

df <- data.table::fread(file = "C/MyFolder/file.csv")

A jsem získat nové tibble s číslem a textem uvnitř buňky:

 var1   var2
   5    1|2|3

Jak správně číst csv. souboru s cílem získat opět tibble s vektorovou uvnitř buňky?

data.table r
2021-11-22 17:17:04
2

Nejlepší odpověď

2

Ty nemusí být schopen to udělat naráz, ale tady je to vlastní funkce, která bude řešit váš problém.

Vlastní Funkce

Funkce str_as_vct() je definován takto:

str_as_vct <- function(x, sep = "|", transform = as.numeric, ...) {
  sapply(
    X = base::strsplit(
      x = x,
      split = sep,
      fixed = TRUE
    ),
    FUN = transform,
    ... = ...,
    simplify = FALSE,
    USE.NAMES = FALSE
  )
}

Popis

Vzít vektor character řetězce, jednotlivé hodnoty odděleny oddělovačem, a rozdělit každý řetězec na vektor jeho hodnot.

Použití

x: Vektor character řetězce, které představují vektory jako oddělené hodnoty.

sep: character string. Oddělovač používá struny v x.

transform: Funkce pro transformaci character vektory na vektory požadovaný datový typ.

...: Další argumenty transform funkce.

Řešení

Ozbrojené s str_as_vct(), váš problém může být vyřešen v jediném úkolu:

df <- data.table::fread(file = "C/MyFolder/file.csv")[
  # Select all rows.
  ,
  
  # Select and transform columns.
  .(var1, var2 = str_as_vct(var2))
]

Výsledek

Vzhledem k počáteční df takhle

df <- tibble(
  var1 = 1:3,
  var2 = list(
    c(1, 2, 3),
    c(4, 5, 6),
    c(7, 8, 9)
  )
)

řešení by měla přinést data.table s následující str()

Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ var1: int  1 2 3
 $ var2:List of 3
  ..$ : num  1 2 3
  ..$ : num  4 5 6
  ..$ : num  7 8 9
 - attr(*, ".internal.selfref")=<externalptr> 

kde každý prvek var2 je numeric vektorové.

Konverze na tibble via as_tibble(df) přinese:

# A tibble: 3 x 2
   var1 var2     
  <int> <list>   
1     1 <dbl [3]>
2     2 <dbl [3]>
3     3 <dbl [3]>
2021-11-22 19:45:31

Díky, funguje, označené jako správné. Otázka: co když existuje mnoho sloupců a kde jsou vektory, nevím předem.
Jack Po

@JackPo Mohl byste upřesnit? To zní, jako jste vy se ptáte na dvě věci: (1) co dělat, když var2 obsahuje neznámé distribuce z nějakého řetězce jako "1|2|3" (které představují vektory) a další řetězce jako "stuff"; a (2) co dělat, když existuje mnoho sloupců jako var2.
Greg

Zjednodušila jsem otázka a ty jsi dal správnou odpověď. Ve skutečnosti, mám tibble s mnoha sloupy a některé z nich mohou obsahovat vektor
Jack Po

@JackPo Hmmm...to je trochu složitější. Můžete mít pevný čas přičemž se rozlišuje mezi (1) buňky, které obsahují číselné vektory jako c(1,2,3) které byly transformovány do řetězce jako "1|2|3"; a (2) buňky, které jsou obsaženy řetězce jako "1|2|3" chcete-li začít s. Můžete použít df %>% across(everything(), str_as_vct) s dplyr balíček, ale možná budete muset vytvořit v kontrolách, aby se zabránilo nezpůsobilé sloupce z transformovány do NAs.
Greg

@JackPo Také, děkuji za označení mé odpovědi jako přijat! Mohl by jste prosím upvote?
Greg

@Grec jsem dostal nápad, díky
Jack Po

Oprava: můžete použít df %>% mutate( across(everything(), str_as_vct) ) s dplyr balíček. Vynechala jsem mutate() v mé předchozí komentáře.
Greg

@Grec Díky ...
Jack Po
0

Zdá se, že vaše csv soubor je rozdělen do | takže je třeba v fread seperator argument jako:

fread(file = "file.csv", sep="|")

Zdravím

2021-11-22 19:14:12

Vaše řešení funguje, pokud je jedna buňka v tabulce, ale pokud existuje několik z nich, pak výsledek je podivné (buňky jsou sloučeny a jiné cely je přidán). Chtěl bych najít univerzální řešení.
Jack Po

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................