2017-12-23 23 views
3

Rデータ処理の問題があります。 readrを使用してロードできる.csvファイルに大きなデータセットがあります。問題は、データフレームに追加する必要がある欠損値があることです。データフレームの連続値を入力してください

例データ:

X1 X2 Value 
Coal 1  300 
Coal 3  100 
Coal 5  150 
NatG 2  175 
NatG 4  150 

このファイルが正しくでロードされます。しかし、最後のデータフレームにX1のすべてのタイプのエントリと、X2のシーケンス全体が1:5という欠損値がゼロに設定されているように処理を追加したいとします。最終データフレームは次のように希望:

X1 X2 Value 
Coal 1  300 
Coal 2  0 
Coal 3  100 
Coal 4  0 
Coal 5  150 
NatG 1  0 
NatG 2  175 
NatG 3  0 
NatG 4  150 
NatG 5  0 

私はゼロに等しいすべてのエントリを持っていたし、同じデータフレームに実際のデータを読み込むファイルにロードするためにreadrを使用してみましたが、それは破壊的な上書きました見つからない行は削除されました。 X1の各値に対して1:5シーケンスのどの値が欠落するかを知らずに、データフレームに適切な行を追加する方法を知る必要があります。

+0

doriengard;将来の編集のためにサンプルデータを追加し、コードをbloacks(灰色)でコードすると、各行を4つのスペースで区切ったり、必要なコードをハイライトして '{}'アイコンをクリックすることができます。 – user20650

+0

おそらく便利です:https://stackoverflow.com/questions/10438969/fastest-way-to-add-rows-for-missing-values-in-a-data-frame; https://stackoverflow.com/questions/41007851/expanding-long-format-time-series-data-with-missing-rows; wwwの回答が与えられているhttps://stackoverflow.com/questions/39961798/how-to-complete-missing-factor-levels-in-data-frame; https://stackoverflow.com/questions/32874239/how-do-i-use-tidyr-to-fill-in-completed-rows-within-each-value-of-a-grouping-var – user20650

答えて

4

パッケージのcomplete機能を使用できます。 complete関数は、提供された列に基づいて組み合わせを作成します。 fill引数は、塗りつぶし値を指定できます。

library(tidyr) 

dt2 <- dt %>% 
    complete(X1, X2, fill = list(Value = 0)) 
dt2 
# # A tibble: 10 x 3 
#  X1 X2 Value 
# <chr> <int> <dbl> 
# 1 Coal  1 300 
# 2 Coal  2  0 
# 3 Coal  3 100 
# 4 Coal  4  0 
# 5 Coal  5 150 
# 6 NatG  1  0 
# 7 NatG  2 175 
# 8 NatG  3  0 
# 9 NatG  4 150 
# 10 NatG  5  0 

一部のグループ値がない場合は、組み合わせのグループ値を指定することもできます。たとえば、列X2 allの1〜5がすべて考慮されていることを確認するために、次の操作を行うことができます。

dt2 <- dt %>% 
    complete(X1, X2 = 1:5, fill = list(Value = 0)) 

または自動列の最小値と最大値に基づいて配列を作成するfull_seqを、使用。 tidyrと@wwwから

dt2 <- dt %>% 
    complete(X1, X2 = full_seq(X2, period = 1), fill = list(Value = 0)) 

DATA

dt <- read.table(text = "X1 X2 Value 
Coal 1  300 
       Coal 3  100 
       Coal 5  150 
       NatG 2  175 
       NatG 4  150", 
       header = TRUE, stringsAsFactors = FALSE) 
2

グレートソリューション。これはベースRでそれを行う方法です。

levels <- 1:5 

type <- c("Coal", "NatG") 

df2 <- expand.grid(levels,type) 

df3 <- merge(dt, df2, by.x=c("X1","X2"), by.y=c("Var2","Var1"),all.y=T) 

df3[is.na(df3)] <- 0 

    X1 X2 Value 
1 Coal 1 300 
2 Coal 2  0 
3 Coal 3 100 
4 Coal 4  0 
5 Coal 5 150 
6 NatG 1  0 
7 NatG 2 175 
8 NatG 3  0 
9 NatG 4 150 
10 NatG 5  0 
+0

これらを有効にしましたしかし、少し追加されています。 [readr]を使用して.csvファイルからデータを読み込むと、最初の入力がデータフレームになりました。最初に[data.table]パッケージから[setDT]を使ってdata.tableに変更しなければなりませんでした。これを実行すると、両方のソリューションが動作します。 – doriengard

+0

ここには 'data.table'は必要ありません。 'dt'' as.data.frame'を設定する必要があるかもしれませんが、それだけです。私はあなたのプライマリテーブルの名前として 'dt'を使いました。なぜなら、これはあなたが使っていたものだからです。 – Mako212

関連する問題