2016-09-13 25 views
2
dfOrig <- data.frame(rbind("1", 
         "C", 
         "531404", 
         "3", 
         "B", 
         "477644")) 
setnames(dfOrig, "Value") 

私は実際には3つの変数を2つの観測値から構成しています。私は、次の構造でdata.frameに変換するにはどうすればよい:複数の行と名前付き列を持つ単一列のデータフレームをデータフレームに変換する

ID  Code  Tag 
"1"  "C"  "531404" 
"3"  "B"  "477644" 

明らかに、これはより多くの観測値と変数で、実世界の問題を説明するためだけのおもちゃの一例です。ここで

+0

を変更することができますdo.call

x <- seq(1:nrow(dfOrig))%%3 res <- do.call("cbind", split(dfOrig,x)) 

を使用して列を結合ですから、作成する必要があります'ID'、' Code'、 'Tag'よりも多くの列がありますか? – Sotos

答えて

4

は別のアプローチだ - それは1,2,3,1,2,3を注文されたdfOrig列に頼らないなど

x <- c("ID", "Code", "Tag") # new column names 
n <- length(x)     # number of columns 
res <- data.frame(lapply(split(as.character(dfOrig$Value), rep(x, nrow(dfOrig)/n)), 
     type.convert)) 

結果のデータは次のとおりです。

> str(res) 
#'data.frame': 2 obs. of 3 variables: 
# $ Code: Factor w/ 2 levels "B","C": 2 1 
# $ ID : int 1 3 
# $ Tag : int 531404 477644 

として、あなたは、列のクラスが変換されていることがわかります。 列をfactorではなくcharacterにする場合は、をdata.frameコールで指定できます。

そしてそれは次のようになります。

> res 
# Code ID Tag 
#1 C 1 531404 
#2 B 3 477644 

注:あなたがdfOrig$Value内のエントリの順序に沿ってxに列名の順序を取得する必要があります。

あなたはxに指定されている、あなたは以下を使用することができますresの列の順序を取得したい場合:

res <- res[, match(x, names(res))] 
+0

優秀ですが、列見出し(ID、コード、タグ)を同時に追加する方法はありますか? – matekus

+0

コラム(df)< - c( "ID"、 "コード"、 "タグ") – cccmir

+0

@matekusを更新しました –

1

たぶんnrowと行列に変換します。

# set number of columns 
myNcol <- 3 

# convert to matrix, then dataframe 
res <- data.frame(matrix(dfOrig$Value, ncol = myNcol, byrow = TRUE), 
        stringsAsFactors = FALSE) 

# convert the type and add column names 
res <- as.data.frame(lapply(res, type.convert), 
        col.names = c("resID", "Code", "Tag")) 
res 
# resID Code Tag 
# 1  1 C 531404 
# 2  3 B 477644 
+0

@docendodiscimus良い点、あなたの記事のように 'type.convert'で別のステップを追加しました。私は行列を使用しているので、あなたとは十分に異なるアプローチであることを願っています。 – zx8754

+1

また、 'byrow = TRUE'、つまり' matrix(dfOrig $ Value、ncol = myNcol、byrow = TRUE) 'を使用することもできます。 – akrun

+1

@akrunありがとう、私は更新します。 – zx8754

0

あなたが作成することができますseqの番号

x <- seq(1:nrow(dfOrig)) %% 3 #you can change this 3 to number of columns you need 

data.frame(ID = dfOrig$Value[x == 1], 
      Code = dfOrig$Value[x == 2], 
      Tag = dfOrig$Value[x == 0]) 


#ID Code Tag 
#1 1 C 531404 
#2 3 B 477644 

別のアプローチは、上記生成されたシーケンスに従ってデータフレームsplitティンとなり、その後、あなたは間違いなく、列名

colnames(res) <- c("Tag", "Id", "Code") 

# Tag  Id Code 
#3 531404  1  C 
#6 477644  3  B 
+1

これを100列に対して実行してください。 – zx8754

+0

2番目の解決策が少し気になることを願っています。 –

関連する問題