2017-10-04 2 views
0

read.socketの出力は、読み込まれた文字列を長さ1の文字ベクトルとして返します。私はそのベクトルをコンマに沿って列に分割し、次に "\ n"に沿って列に分割したいと思います。長さ1の文字ベクトルをカンマで行と列に変更します。

[1]「43017-10-04 10:00:15,43551.435,1,43415438,43551.435,43551.50,44360547,0,0、C、\

これはread.socketからですr \ n43017-10-04 10:00:15,43551.50,4,43415437,43551.435,43551.50,44360554,0,0、C、\ r \ n43017-10-04 10:00:15,43551.50,1,43415435 、43551.435,43551.50,44360554,0,0、C、\ R \ nは

I列を表す各コンマたい、と "の\ n" で新しい行を取得する。

I」はこの特定のケースで役に立たないように見て回った。

答えて

1

あなたは

ここ
library(tidyverse) 
library(stringr) 

s <- "43017-10-04 10:00:15,43551.435,1,43415438,43551.435,43551.50,44360547,0,0,C,\r\n43017-10-04 10:00:15,43551.50,4,43415437,43551.435,43551.50,44360554,0,0,C,\r\n43017-10-04 10:00:15,43551.50,1,43415435,43551.435,43551.50,44360554,0,0,C,\r\n" 

tbl <- str_split(s, "\n")[[1]] %>% tibble %>% 
    separate(col=1, into=as.character(1:11), sep=",") 
+1

手でコンマの数を数えたくない場合は、num_cols < - length(unlist(gregexpr( "、" s))) ' – Nate

0

... separate()into引数の列名の文字ベクトルを作成したいと思う動的なソリューションです:

myData <- "43017-10-04 10:00:15,43551.435,1,43415438,43551.435,43551.50,44360547,0,0,C,\r\n43017-10-04 10:00:15,43551.50,4,43415437,43551.435,43551.50,44360554,0,0,C,\r\n43017-10-04 10:00:15,43551.50,1,43415435,43551.435,43551.50,44360554,0,0,C,\r\n" 

splitCol <- strsplit(myData, "\r\n") 
df <- data.frame(matrix(ncol = length(splitCol[[1]]))) 

listCol <- c() 

for (i in seq(length(splitCol[[1]]))) { 
    temp <- strsplit(splitCol[[1]][i], ",") 
    listCol <- c(listCol, temp) 
} 

df <- as.data.frame(listCol) 
names(df) <- 1:length(df) 
df <- t(df) # Transpose 

結果:

> print(df) 
    [,1]     [,2]  [,3] [,4]  [,5]  [,6]  [,7]  [,8] [,9] [,10] 
1 "43017-10-04 10:00:15" "43551.435" "1" "43415438" "43551.435" "43551.50" "44360547" "0" "0" "C" 
2 "43017-10-04 10:00:15" "43551.50" "4" "43415437" "43551.435" "43551.50" "44360554" "0" "0" "C" 
3 "43017-10-04 10:00:15" "43551.50" "1" "43415435" "43551.435" "43551.50" "44360554" "0" "0" "C" 
+0

ありがとうございます。列と行は逆さまです。ループしないことを望んでいた。 – tommylicious

+0

転置機能で編集しました。ループを取り除くには、Benjamin Christoffersenソリューションと組み合わせてください。 –

0

ビセンテKに似たソリューションですが、よりコンパクトです。sapply

> .text <- "43017-10-04 10:00:15,43551.435,1,43415438,43551.435,43551.50,44360547,0,0,C,\r\n43017-10-04 10:00:15,43551.50,4,43415437,43551.435,43551.50,44360554,0,0,C,\r\n43017-10-04 10:00:15,43551.50,1,43415435,43551.435,43551.50,44360554,0,0,C,\r\n" 
> 
> dt <- sapply(strsplit(.text, "\r\n")[[1]], 
+    strsplit, split = ",", USE.NAMES = FALSE) 
> names(dt) <- 1:length(dt) # avoid default names 
> data.frame(dt) 
        X1     X2     X3 
1 43017-10-04 10:00:15 43017-10-04 10:00:15 43017-10-04 10:00:15 
2    43551.435    43551.50    43551.50 
3      1     4     1 
4    43415438    43415437    43415435 
5    43551.435   43551.435   43551.435 
6    43551.50    43551.50    43551.50 
7    44360547    44360554    44360554 
8      0     0     0 
9      0     0     0 
10     C     C     C 
0

ここにいくつかの方法があります。彼らは後でいくつかのクリーニングが必要になりますが、あなたを始めなければなりません。

# read in the data 
temp <- readLines(textConnection("43017-10-04 10:00:15,43551.435,1,43415438,43551.435,43551.50,44360547,0,0,C,\r\n43017-10-04 10:00:15,43551.50,4,43415437,43551.435,43551.50,44360554,0,0,C,\r\n43017-10-04 10:00:15,43551.50,1,43415435,43551.435,43551.50,44360554,0,0,C,\r\n")) 

結果は、ベクトルの各要素が最終オブジェクトの行になる文字ベクトルです。 readLinesはデフォルトでそれぞれ\nの入力を分割します。


まず、あなたはdo.callで文字ベクトルとrbindそれらすべてのリストを取得するにはstrsplitを使用することができます。例えば

# return a character matrix 
do.call(rbind, strsplit(temp, ",")) 

、最初の5列

do.call(rbind, strsplit(temp, ","))[, 1:5] 
    [,1]     [,2]  [,3] [,4]  [,5]  
[1,] "43017-10-04 10:00:15" "43551.435" "1" "43415438" "43551.435" 
[2,] "43017-10-04 10:00:15" "43551.50" "4" "43415437" "43551.435" 
[3,] "43017-10-04 10:00:15" "43551.50" "1" "43415435" "43551.435" 

だけdata.frameでこれらを包む、data.frameを返すように。

第二には、data.tabletstrplitを使用して、あなたはdata.frameを返すために

library(data.table) 
data.frame(tstrsplit(temp, ",", names=TRUE)) 

を行うことができます。最初の5列は再び

    V1  V2 V3  V4  V5 
1 43017-10-04 10:00:15 43551.435 1 43415438 43551.435 
2 43017-10-04 10:00:15 43551.50 4 43415437 43551.435 
3 43017-10-04 10:00:15 43551.50 1 43415435 43551.435 
4     <NA>  <NA> <NA>  <NA>  <NA> 

であることに注意してください。基礎となるベクトルはクラスファクタなので、数値や文字などに変換する必要があります。

関連する問題