Csv nasıl okunur. verilerde vektör bulunan dosyalar.masa paketi mi?

0

Soru

İçinde bir sayı ve bir vektör bulunan bir tibble (df adında) oluşturdum:

library(tsibble)
library(data.table)

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

var1   var2
 5   c(1,2,3)

Sonra bu tibble'ı csv olarak kaydettim. dosya gibi yani:

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

Şimdi bu dosyayı okumak istiyorum:

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

Ve bir hücrenin içinde sayı ve metin içeren yeni bir tibble alıyorum:

 var1   var2
   5    1|2|3

Bir csv'yi doğru şekilde nasıl okuyabilirim. bir hücrenin içinde bir vektörle tekrar bir tibble elde etmek için dosya mı?

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

En iyi cevabı

2

Bunu tek seferde yapamayabilirsiniz, ancak sorununuzu çözecek özel bir işlev var.

Özel İşlev

İşlev str_as_vct() aşağıdaki gibi tanımlanır:

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
  )
}

Tanım

Bir vektör al character her biri bir sınırlayıcı ile ayrılmış değerlere sahip dizeler ve her dizeyi değerlerinin bir vektörüne bölün.

Kullanma

x: Bir vektör character vektörleri sınırlandırılmış değerler olarak temsil eden dizeler.

sep: Bir character bağcık. Dizeler tarafından kullanılan sınırlayıcı x.

transform: Dönüştürmek için bir işlev character vektörler istenen veri türünün vektörlerine dönüştürülür.

...: Diğer argümanlar transform işlev.

Çözüm

İle silahlı str_as_vct() sorununuz tek bir ödevde çözülebilir:

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

Sonuç

Bir başlangıç verildiğinde df bunun gibi

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

çözüm bir sonuç vermelidir data.table aşağıdakilerle 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> 

her öğenin nerede var2 is a numeric vektör.

A'ya dönüştürme tibble ile as_tibble(df) verecek:

# 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

Teşekkürler, çalışıyor, doğru olarak işaretlendi. Soru: ya çok sayıda sütun varsa ve vektörlerin nerede olduğunu önceden bilmiyorum.
Jack Po

@ JackPo Açıklığa kavuşturabilir misin? İki şey soruyormuşsunuz gibi geliyor: (1) eğer ne yapmalı var2 gibi bazı dizelerin bilinmeyen bir dağılımını içerir "1|2|3" (vektörleri temsil eden) ve diğer dizeler gibi "stuff"; ve (2) gibi birçok sütun varsa ne yapmalı var2.
Greg

Soruyu basitleştirdim ve doğru cevabı verdin. Gerçekte, birçok sütuna sahip bir kaval kemiğim var ve bazıları bir vektör içerebilir
Jack Po

@ JackPo Hmmm...bu biraz daha karmaşık. Aşağıdaki gibi sayısal vektörler içeren (1) hücreler arasında ayrım yapmakta zorlanabilirsiniz c(1,2,3) bu gibi dizelere dönüştürüldü "1|2|3"; ve (2) aşağıdaki gibi dizeler içeren hücreler "1|2|3" başlangıçta. Kullanabilirsiniz df %>% across(everything(), str_as_vct) ile...dplyr paket, ancak uygun olmayan sütunların dönüştürülmesini önlemek için denetimler oluşturmanız gerekebilir NAs.
Greg

@JackPo Ayrıca cevabımı kabul olarak işaretlediğiniz için teşekkür ederim! Siz de rica eder misiniz?
Greg

@ Grec Fikrim var, teşekkürler
Jack Po

Düzeltme: Kullanabilirsiniz df %>% mutate( across(everything(), str_as_vct) ) ile...dplyr paket. Kaldı mutate() önceki yorumlarımda.
Greg

@Grec Teşekkürler ...
Jack Po
0

Öyle görünüyor ki senin csv dosya şu şekilde ayrılır: | yani ihtiyacın var fread ayırıcı argüman gibi:

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

Selamlar

2021-11-22 19:14:12

Senin çözüm işe yararsa orada bir hücrede tablo, ama daha çok bir sonucudur garip (hücreler birleştirilerek başka bir hücreye eklenir). Evrensel bir çözüm bulmak istiyorum.
Jack Po

Diğer dillerde

Bu sayfa diğer dillerde

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