簡體   English   中英

R:將數據框列名與數字連接

[英]R: Concatenate data frame column name with a number

我有這個簡單的代碼,可以創建矩陣和數據框:

   mat=matrix(rnorm(40*5), ncol=5)
   df=as.data.frame(mat)
   df2 <- tidyr::gather(df, "x", "y", V1:V5)

這是mat創建的head(df):

           V1          V2          V3          V4          V5
1   0.97111725  0.12937942 -0.89643594 -0.30144874  0.10405400
2   0.68372321 -0.08049954 -0.52891953 -0.56752185 -1.04425728
3   1.04553733  0.24499356  0.25919424 -1.51280159  0.70952009
4   0.16433896 -0.46727565 -0.22030923  1.18732203  0.17529333
5  -1.73732058  0.04977374  1.54042252 -1.27585563 -1.05846972
6   0.35953274  3.09224985 -1.24524965 -0.67492542 -0.68065365

然后,我創建另一個數據框df2 ,在其中將值收集到兩列xy

df2 <- tidyr::gather(df, "x", "y", V1:V5)

當我獲得矩陣具有不同列數的新數據集時,必須將df2的列值更改為另一個數。

示例 :在這里我使用V5因為我有5列: df2 <- tidyr::gather(df, "x", "y", V1:V5)所以現在如果我得到一個包含40列的新矩陣,我必須更改它手動更改為V20df2 <- tidyr::gather(df, "x", "y", V1:V20)

有什么辦法可以這樣寫: df2 <- tidyr::gather(df, "x", "y", V1:V+ncol(mat)

是! 您可以使用粘貼。

df2 <- tidyr::gather(df, "x" ,"y", V1:paste0("V", ncol(mat)))

當然,您使用的是所有列,因此無需指定名稱。 但是在您真正要引用變量列名的情況下,這就是我的處理方法。

另外,如果您要使用以“ V”開頭的所有列,則可以執行

df2 <- tidyr::gather(df, "x", "y", dplyr::starts_with("V"))

看起來您也可以簡單地將列作為字符傳遞:

df3 <- tidyr::gather(df, "x", "y", names(df)[1]:names(df)[5])

或者如您在示例中特別聲明要從V1:V+ncol(df)您可以執行以下操作:

df3 <- tidyr::gather(df, "x", "y", "V1":tail(names(df),1))

然后與您的結果進行比較:

identical(df2,df3)
#[1] TRUE

這可能很好,因為與排除任何列並自動收集所有列的選項相比,它提供了靈活地以編程方式選擇所需范圍的列的靈活性。

簡單的列索引也可以與gather一起使用。

gather的文檔將...參數讀取為:

列的選擇。 如果為空,則選擇所有變量。 您可以提供裸變量名稱,提供裸變量名稱,使用x:z選擇x和z之間的所有變量,使用-y排除y。 有關更多選項,請參見dplyr :: select()文檔。

mat=matrix(rnorm(40*5), ncol=5)
df=as.data.frame(mat)

df2 <- tidyr::gather(df, "x", "y", 1:5)

#OR
df2 <- tidyr::gather(df, "x", "y", V1:V5)

#OR
df2 <- tidyr::gather(df, "x", "y")  #all columns 


head(df2)
# x          y
# 1 V1 -0.7403657
# 2 V1 -0.7501310
# 3 V1  2.0371748
# 4 V1 -1.2647994
# 5 V1  1.3464162
# 6 V1 -1.8981365

tail(df2)
# x          y
# 195 V5 -2.2739219
# 196 V5 -0.8606414
# 197 V5 -0.8102747
# 198 V5  0.6362617
# 199 V5  0.9962820
# 200 V5  1.6503455

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM