2017-08-07 6 views
1

I次のデータフレームがあります。がどのように列名を交互にすることによって、データフレームの列を複製する


df <- structure(list(Vertebral = c(16.43, 1.06, 0.38), BoneMarrow = c(19.69, 
1.16, 1.13)), .Names = c("Vertebral", "BoneMarrow"), row.names = c("Gnai3", 
"Cdc45", "Cav2"), class = "data.frame") 

df 
#>  Vertebral BoneMarrow 
#> Gnai3  16.43  19.69 
#> Cdc45  1.06  1.16 
#> Cav2  0.38  1.13 

は私がやりたいことは、次のようになり、データフレームを作成された:

つまり、元の列名ごとに、「control」と「treated」を接尾辞とする2つのコピーを作成します。

 Vertebral.control BoneMarrow.control Vertebral.Treated BoneMarrow.Treated 
Gnai3  16.43   19.69    16.43    19.69 
Cdc45  1.06   1.16    1.06    1.16 
Cav2  0.38   1.13    0.38    1.13 

どうすればいいですか?

私はこのコードでこだわっている:


library(tidyverse) 

subtype <- colnames(df) 
expand.grid(subtype,c("Control","Treated")) %>% 
mutate(new_col = paste0(Var1,".",Var2)) 
#>   Var1 Var2   new_col 
#> 1 Vertebral Control Vertebral.Control 
#> 2 BoneMarrow Control BoneMarrow.Control 
#> 3 Vertebral Treated Vertebral.Treated 
#> 4 BoneMarrow Treated BoneMarrow.Treated 

答えて

2

あなたがcbindを試すことができます:rlang::symdplyrを使用して

x1 <- setNames(df, paste0(names(df), '.', 'control')) 
x2 <- setNames(df, paste0(names(df), '.', 'Treated')) 
cbind(x1, x2) 

#  Vertebral.control BoneMarrow.control Vertebral.Treated BoneMarrow.Treated 
# Gnai3    16.43    19.69    16.43    19.69 
# Cdc45    1.06    1.16    1.06    1.16 
# Cav2    0.38    1.13    0.38    1.13 

代替ソリューション:

x <- syms(rep(names(df), 2)) 
names(x) <- paste0(rep(names(df), 2), rep(c('.control', '.Treated'), each = ncol(df))) 
res <- df %>% mutate(!!!x) 
rownames(res) <- rownames(df) 

!!!は、要素のリストを取り、それらをスプライスして呼び出します(do.callと考えてください)。詳細はhereにあります。

+0

は、私が質問してくださいすることができます?。機能は何ですか?行う??その意味は何ですか?それをどのように参照するのですか? – Onyambu

+0

@Onyambu、私の編集とリンクを見てください。 – mt1022

1

私はcbind

df2 = cbind(df, Vertebral.Treated=rep(df$Vertebral), BoneMarrow.Treated =rep(df$BoneMarrow)) 

print(df2) 
    Vertebral BoneMarrow Vertebral.Treated BoneMarrow.Treated 
Gnai3  16.43  19.69    16.43    19.69 
Cdc45  1.06  1.16    1.06    1.16 
Cav2  0.38  1.13    0.38    1.13 

を使用して、このような単純なアプローチを取るだろうあなたが必要な列の任意の量を作成することができます。また、linkを参照してください。

2

簡単に、より多くのカラムやグループに拡張されるべきバージョン:

newdf <- df[0] # creates an empty data.frame with the same row count 
newdf[paste(names(df), rep(c("control","treated"),each=ncol(df)), sep=".")] <- df 
newdf 

#  Vertebral.control BoneMarrow.control Vertebral.treated BoneMarrow.treated 
#Gnai3    16.43    19.69    16.43    19.69 
#Cdc45    1.06    1.16    1.06    1.16 
#Cav2    0.38    1.13    0.38    1.13 
関連する問題