[英]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
,在其中將值收集到兩列x
和y
。
df2 <- tidyr::gather(df, "x", "y", V1:V5)
當我獲得矩陣具有不同列數的新數據集時,必須將df2
的列值更改為另一個數。
示例 :在這里我使用V5
因為我有5列: df2 <- tidyr::gather(df, "x", "y", V1:V5)
所以現在如果我得到一個包含40列的新矩陣,我必須更改它手動更改為V20
: df2 <- 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.