2016-10-06 5 views
-1

2つの列を結合するときに直面する問題を扱う非常に面白い方法を思いつきましたが、私がしたことをより効率的に行う方法が必要です。 Rの初心者のための提案は非常に高く評価されるだろう。数値ベクトルでのNAの扱いと変換の使用

私は長年に渡って、コードと位置の2つの列を持っています。 2004年のデータにはコードと場所が分かれていますが、2012にはコードと場所が結合されており、コード列は空のままです。最初にデータを標準化する必要があるので、code_locationという1つの列には、すべての観測でコードと位置が結合されています。さらに2つの列が作成されます。ここ

データである:

df <- read.table(text = c(" 
observation  year  code  location 
1    2004  23-940 town no. 1 
2    2004  23-941 town no. 2 
3    2012  NA  23-940 town no. 1 
4    2012  NA  23-941 town no. 2"), header = TRUE) 

私はそれをするためのコードと場所を組み合わせで働い

df_combined <- transform(df, code_location = paste(code, location, sep = " ")) 

2つの列を結合するために以下のコードでtransformpasteを使用しようとしたが、 2004年の観測であるが、2012年の観測ではコード欄のNAsも含まれていた。 (NB、コードと場所の両方が数値ベクトルです。私は、この後が重要になり、正規表現を使用しています。私はNAを取り除くために、コード欄にas.characterを試してみましたが、それはその後、私の正規表現を台無しに。)

observation  year  code_location 
1    2004  23-940 town no. 1 
2    2004  23-941 town no. 2 
3    2012  NA 23-940 town no. 1 
4    2012  NA 23-941 town no. 2 

これを回避するために、2つのデータフレームを作成し、code_locationを取得するために必要な作業を行い、データフレームを再度結合するために、どの観測でNAがあったのか、そうでなかったのかを教えてくれたsplitというダミーを作成しました。ここに私のコードです:

df$cheat <- ifelse(is.na(df$code) == T, 0, 1) 
ls_df <- split(df, df$cheat) 
df_code <- ls_df[[2]] 
df_na <- ls_df[[1]] 

df_code <- transform(df_code, code_location = paste(code, location, sep = " ")) 

df_combined <- rbind(df_code, df_na) 

そして私は私の所望の出力が、非常にラウンドアバウトで次の出力を取得。

observation  year  code_location 
1    2004  23-940 town no. 1 
2    2004  23-941 town no. 2 
3    2012  23-940 town no. 1 
4    2012  23-941 town no. 2 

答えて

1

あなたはifelse機能を使用することができます

transform(df, code_location = ifelse(is.na(code), 
            as.character(location), 
            paste(code, location))) 

df$locationが要因であるので、それ自体で使用した場合、それは文字に変換する必要があることを。

0

データを読み込むコードが機能しない場合は、dput()を使用して使用可能なサンプルデータを提供してください。

私はあなたの問題のためにapply()を使用してソリューションを提案:

as.data.frame(t(apply(df,1,function(row_tmp){ 
    if(is.na(row_tmp[3])){ 
     split_tmp <- strsplit(row_tmp[4]," ")[[1]] 
     row_tmp[3] <- split_tmp[1] 
     row_tmp[4] <- paste(split_tmp[-1], collapse = " ") 
    } 
    return(row_tmp) 
})), stringsAsFactors= F) 

適用する機能は、すべての行を通過し、NAが3列に遭遇した場合は、最後の列を分割します。

関連する問題