2017-10-03 5 views
0

私はこのようなデータフレームを持っている:Rの値から列を作成するには?

   X1     X2 
1  Country     Spain 
2  Year     2016 
3  Value     34.56 
4  Country     Italy 
5  Year     2016 
6  Value     48.21 
7  Country     USA 
8  Year     2016 
9  Value     84.37 
10  Country    France 
11  Year     2016 
12  Value     18.94 

など

X1及びX2は列です。私はウェブサイトからこのデータをかき取り、私はこれを持っているしたいと思います:

Country Year Value 
Spain  2016 34.56 
Italy  2016 48.21 
USA  2016 84.37 
France  2016 18.94 

私はgather()機能で何かをしようとしたが、私は失敗しました。どんな助けでも大歓迎です。

+1

これは重複して質問ですが、私は現時点では良い記事を見つけることができません。最も簡単な方法は 'unstack(dat、X2〜X1)'です。 datはあなたのdata.frameの名前です。新しい列は要素なので、それらを通過して関連する列を数値に変換する必要があります。 'newDat [2:3] < - lapply(newDat [2:3]、as.numeric)のようなものです。 – lmo

答えて

0

あなたの現在のデータフレームがdf呼び出された場合、これはトリックを行う必要が:

Country <- df$X2[df$X1 == "Country"] 
Value <- df$X2[df$X1 == "Value"] 
Year <- df$X2[df$X1 == "Year"] 

df_new <- data.frame(Country, Year, Value) 
+0

これは私に多くの助けをします、ありがとう、しかし私は別の問題があります。私はいくつかの欠落したデータを持っていますが、NAではなく空の値を持っています。国:シリア、年:2016、値:何もない、それは空です。どのように私はあなたのメソッドを使用してこれでデータフレームを作ることができますか? –

+0

データフレームに空の値を入れることはできません(行番号はすべての列で同じにする必要があります)。たぶんそれは空ではなく空白です。 あなたがまだインポートされていないデータで、データフレームに入れることはできませんか? – brettljausn

2

試してみてください。

output <- data.frame(t(matrix(data$X2,3))) 
colnames(output) <- c("Country", "Year", "Value") 

あなたは、変数の長さを持っていますが、「国は、」新しい「ブロック情報の」試みの最初の行に常にある場合:本質的には

library(data.table) # because i dont like data.frame 
library(zoo) # for na.locf (last observation carried forward) 
dt <- data.table(df) 
dt[X1 == "Country", X3 := 1:length(X1 == "Country")] 
dt[, X3 := na.locf(X3)] 
dt 
dcast(dt, X3 ~ X1) 

これが作成されますテーブルを長形式から幅広形式にキャストするために使用できるID列(X3)。

+0

私の間違いは、このデータが乱雑であるとは言いませんでした。国、年、値、国、年、値、国、値、国、年、値、GDP、国、年、値などのようなものがX1にあります。 –

+0

それについても考えました。データが完全である(つまり欠損値がない)場合と混在しない場合(すなわち、ある国Aの値が他の3つの国の値に続く場合、この場合は明らかに不可能です)、まずX1でデータフレームをソートし、上記のようなことをしてください。 – guscht

+0

元の回答をより一般的に調整しました。 – guscht

関連する問題