2017-08-07 67 views
1

,我有以下的數據幀:如何通過交替列名複製數據幀列


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'作爲後綴。

 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

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 

使用rlang::symdplyr另一種解決方案:

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 
相關問題