日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

不定形データをR内で整形する:Reshape an irregualr data in R.

手違いで、過去の記事を消してしまいました
キャッシュから持ってきてとりあえず復元してみる

はじめに

Hi Raja,

I deleted my blog today.
I had received your comment before, but I lost.
I searched my archive and recover my script.

Thanks.

ここから

久しぶりに、R関係で質問を受けたので、そのご返事を書くことにした。

最近は老舗のRjpWikiはもちろんのこと、TokyoR(次回は4/28だそうな…)などの地域コミュニティーが活発です。
そこには、いろいろな人がいて、いろいろな対応をされているようです。
なので、私の興味は離れてきたのも事実。
専ら、LinkedInコミュニティーにシフトしています。

そこで感じたこと

  • 国家間でインフラの差があまりにも大きい
  • 書籍一つ手に入れることも難しい国がある
  • RはOSSでありながら、活用できない方が大勢いる

ということです。

「教えて君」という言葉がある。

これは途上国では、切実な言葉です。
調べることすらできない人、そういう方がいるという現実。

今日は途上国のある方への、ご返事です。
ただ、英語すら拙い私がどこまで回答できるのか…

This is my solution

Hi. I'm glad you to ask the question about R.

I checked your data sheet. I think that this is an irregular data to import into R.
Therefore, I recommend to reshape your data to an appropriate matrix for R.

Your data consists of value and measured data, but this isn't a matrix shape.
Surely, a top row is value and the others are measured data, but a top line is separated by comma and the others are separated by several spaces.

For example...
Your data is similar to that.

A,B,C,D,E <- separated by comma
1 2 3 <- separated by several space in all below lines
4 5
6 7 8
9 10
11 12 13
14 15

An important point is that a top line is a value and one data consists of two set of row.
Maybe, you wrote this code.

> data <- read.table("file.txt", sep=" ")
 以下にエラー scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
   1 行目には 11 個の要素がありません 

This code isn't appropriate, because "read.table" needs the complete matrix design.
So, you might be better to import data by each line.

> dat <- readLines("file.txt")
> values <- unlist(strsplit(dat[1], split=","))
> dat <- sapply(seq(2, length(dat)-1, by=2), function(i){
+  x <- unlist(strsplit(dat[c(i, i+1)], split=" "))
+  return(as.numeric(x[nchar(x)>0]))
+ })
> rownames(dat) <- values
> dat <- as.data.frame(t(dat))
> dat
   A  B  C  D  E
1  1  2  3  4  5
2  6  7  8  9 10
3 11 12 13 14 15

I think this code is your wanted solution.

If you don't understand this code, please ask me a question anytime. :D
Thanks.