2016-04-12 10 views
1

多くの変数を含む大きなデータセットを使用しています。したがって、私は常に列名を入力しないようにしたい。私は自分のデータ内の列を繰り返し処理し、列ごとに値を含む値を抽出したいと考えています。言い換えれば、私は列ごとに別々のデータテーブルを作成したいが、いずれもNA値を含んでいない。R:データテーブルの列のNA値を繰り返し抽出せず、列名を入力せずに別々の列に分割します

私のアプローチは、最初に列ごとにNA値を取り除くループを作成することです。 .csvファイルを読むとき(freadを使って)、別の列の行列で列名を抽出しました。問題は、自分のアプローチで列名やNAを除外することができなかったことです。私はこの問題を説明するために、小さな例を働いた:

# Example data 
dt = data.table(color=c("b","g","r","y",NA), 
       size=c("S", "XL", NA, NA, "M"), 
       number=(1:5)) 
columns = matrix(c("color", "size", "number"), nrow=3, ncol=1) 

それは本当にループではありませんが、それはまだ最初の行に列名を挿入する必要があるため、以下に示すループは、動作します:

# Works (but requires typing in the column name) 
for(i in 1:1){ 
    var <- dt %>% group_by(color) %>% filter(!is.na(color)) 
    name <- paste("new", columns[i], sep=".") 
    assign(name, var[, columns[i], with=FALSE])} 

# Output: 
    color 
(chr) 
1  b 
2  g 
3  r 
4  y 

私の考えは、抽出された列名を使用して、ループ内を後続の列に参照することです。誰もが(長さの異なる)別の列で終わるために私を助けることができる

# Does not work 
for(i in 1:1){ 
    var <- dt %>% group_by(columns[i]) %>% filter(!is.na(columns[i])) 
    name <- paste("new", columns[i], sep=".") 
    assign(name, var[, columns[i], with=FALSE])} 

# Output: 
    color 
(chr) 
1  b 
2  g 
3  r 
4  y 
5 NA 

:ここでの問題は、ループ内のコードの最初の行は動作していない、すなわち、NA値が排除されませんということです列名を入力せずにNA値を含まない(私が使用した方法よりももう一つのアプローチは確かに歓迎です。)事前に感謝!

答えて

3
sapply(columns, function(x) c(na.omit(dt[[x]])), USE.NAMES = T) 
#$color 
#[1] "b" "g" "r" "y" 
# 
#$size 
#[1] "S" "XL" "M" 
# 
#$number 
#[1] 1 2 3 4 5 

c()は必要ありません - 私はちょうど出力をより明確にするためにna.omitクラス情報を取り除くためにそれを使用しました。

assignを使用しないでください。上記のようにリストに項目を格納し、それを使用してください。

+0

ありがとう@eddi、これはかなりうまくいきます。私は、もし私が望むなら、私が別々に抽出することができる各列を含むリストで終わる。 私がassignを使用したのは、列の名前を自動化することにもなりたいからです。あなたの答えを使って、リストから各列を抽出して同時に名前を付けるプロセスを自動化するために、assignを使ったループが必要です。 あなたの答えは半分の質問に役立ちますが、名前を入力する代わりに数値/インデックスを使用して自動的にデータ(テーブル)を命名するという問題は別の質問です。 – Slycie

+0

@SophieClock私はあなたが何を意味するのか少し混乱しています - 上のリストには名前付き要素があります – eddi

+0

こんにちは@eddi、私は説明しようとします。私は列に名前を付けましたが、私はそれらを使用しないことを好みます。実際のデータセットには何百もの変数が含まれており、これらの名前をすべて入力するのは効率的な解析方法ではないためです。そのため、最初に番号で列を認識し、その後これらの列にラベルを付けるループ(データを読み込むときに自動的に配列に格納される)を使用してプロセスを自動化しようとしています。 – Slycie

関連する問題