2016-11-29 21 views
0

この質問は以前の質問(私の検索に基づく)に似ていますが、ひねられています。 [s、l、v]を適用して効率化を図ることを望みます。私は出力を生成し、それぞれのvar#のバージョン1(v1)およびバージョン2(v2)からの情報を融合する新しい機能を作成したいR - 複数の類似変数の前の列に基づく新しい列

id var1_dose_v1 var1_dose_v2 var2_dose_v1 var2_dose_v2 var3_dose_v1 var3_dose_v2 
1   2   NA   NA   1   NA   1 
2   4   NA   4   NA   NA   4 
3   NA   4   2   NA   2   NA 
1   1   NA   3   NA   3   NA 
2   NA   3   5   NA   5   NA 

の下に次のようになります

df <- data.frame(id = c(1,2,3,1,2), var1_dose_v1 = c(2,4,NA,1,NA), 
      var1_dose_v2 = c(NA,NA,4,NA,3), 
      var2_dose_v1 = c(NA,4,2,3,5), 
      var2_dose_v2 = c(1,NA,NA,NA,NA), 
      var3_dose_v1 = c(NA,NA,2,3,5), 
      var3_dose_v2 = c(1,4,NA,NA,NA))) 

以下。

id var1_dose var2_dose var3_dose 
1   2   1   1 
2   4   4   4 
3   4   2   2 
4   1   3   3 
5   3   5   5 

何千ものvarがあるので、私はapplyを使用することが重要です。

ありがとうございました!

+0

あなたの質問にお答えしますか?次のマインド:http://stackoverflow.com/help/someone-answers –

答えて

0

This-

df[is.na(df)] <- 0 
new_df <- sapply(seq(1:((ncol(df)-1)/2)), function(x) 
      { 
      df[, paste0("var",x,"_dose_v1")] + df[, paste0("var",x,"_dose_v2")] 
      }) 
+0

いくつかの変数に3つの線量があり、他の変数に2つの線量がある場合はどうなりますか? –

+0

簡素化のために、解決策は一般化されず、質問によって掲示された要件に限定されています。あなたが正しいです、これは、用量のバージョンの異なる数がある場合は動作しません –

0
func <- function(i){ 
    col <- paste0("var",i,"_dose") 
    xx <- colnames(df)[grep(col, colnames(df))] 
    yy <- rowSums(df[xx], na.rm = TRUE) 
} 
l = lapply(1:((dim(df)[2]-1)/2) , func) 

df1 = as.data.frame(l) 
colnames(df1) <- paste0("var",1:((dim(df)[2]-1)/2),"_dose") 

# > df1 
# var1_dose var2_dose var3_dose 
# 1   2   1   1 
# 2   4   4   4 
# 3   4   2   2 
# 4   1   3   3 
# 5   3   5   5 

2つのバージョンは常に隣り合わせであることを行っている場合:その後、私のコードのconcisedバージョンが持っているために

l = lapply(1:((dim(df)[2]-1)/2), 
    function(i) rowSums(df[colnames(df)[c(i*2,i*2+1)]], na.rm = T)) 
df1 = as.data.frame(l) 
colnames(df1) <- paste0("var",1:((dim(df)[2]-1)/2),"_dose") 
0

可能性があり任意の数の変数または線量に対して一般的な解であるため、dplyrの新しい関数は「合体」と呼ばれ、

library(dplyr) 
grps <- unique(sub("_v.*$?", "", names(df)[-1])) 
mat <- sapply(grps, function(g) { 
    do.call("coalesce", unname(as.list(df[grep(g, names(df))]))) 
}) 
df2 <- data.frame(id=df$id, mat) 
# id var1_dose var2_dose var3_dose 
# 1 1   2   1   1 
# 2 2   4   4   4 
# 3 3   4   2   2 
# 4 1   1   3   3 
# 5 2   3   5   5 
関連する問題