我有一個數據框,其中列的名稱類似於a,b,v1,v2,v3。 .v100。 我想創建一個新的列,該列只將函數應用於名稱包含'v'的列。R,在數據框中創建一個應用所有具有相似名稱的列的函數的列
例如,給定該數據幀
df<-data.frame(a=rnorm(3),v1=rnorm(3),v2=rnorm(3),v3=rnorm(3))
我想創建一個新的列,其中每個元素是在同一行中的V1,V2和V3中的元素的總和。
我有一個數據框,其中列的名稱類似於a,b,v1,v2,v3。 .v100。 我想創建一個新的列,該列只將函數應用於名稱包含'v'的列。R,在數據框中創建一個應用所有具有相似名稱的列的函數的列
例如,給定該數據幀
df<-data.frame(a=rnorm(3),v1=rnorm(3),v2=rnorm(3),v3=rnorm(3))
我想創建一個新的列,其中每個元素是在同一行中的V1,V2和V3中的元素的總和。
這應該做:
df$sums<- rowSums(subset(df, select=grepl("v", names(df))))
對於一個更通用的方法:
apply(subset(df, select=grepl("v", names(df))), 1, sum)
grep
上names
拿到列位置,然後使用rowSums
:
rowSums(df[,grep("v",names(df))])
要結合@詹姆斯和@阿納託利的回答,
apply(df[grepl('^v', names(df))], 1, sum)
我繼續並將正則表達式中的v錨定到字符串的開頭。其他的例子還沒有這樣做,但看起來你希望所有以v開頭的列不是可能在名字中有v的較大集合。如果我錯了,你可以只是做
apply(df[grepl('v', names(df))], 1, sum)
你應該避免編程時使用subset()
,如?subset
說這是旨在用於交互的便捷功能。對於 編程,最好使用標準子集函數,如 '[',特別是參數 '子集'的非標準評估可能會產生意想不到的後果。
而且,正如我昨天from Richie Cotton瞭解到,索引最好是使用grepl
比grep
時。
如果只選擇一列,使用'df [grep(「v」,names(df))]'來避免轉換爲向量。比較'df [,「v1」]和'df [「v1」]''。 – Marek