R,在数据框中创建一个新列,该列应用具有相似名称的所有列的函数

时间:2011-09-13 09:25:37

标签: r dataframe

我有一个数据框,其中列的名称类似于a,b,v1,v2,v3 ... v100。 我想创建一个新列,仅将函数应用于名称包含“v”的列。

例如,给定此数据框

df<-data.frame(a=rnorm(3),v1=rnorm(3),v2=rnorm(3),v3=rnorm(3))

我想创建一个新列,其中每个元素是同一行中v1,v2和v3元素的总和。

3 个答案:

答案 0 :(得分:6)

grep上的{p> names获取列位置,然后使用rowSums

rowSums(df[,grep("v",names(df))])

答案 1 :(得分:3)

将@ James和@Anatoliy的答案结合起来,

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

答案 2 :(得分:2)

应该这样做:

df$sums<- rowSums(subset(df, select=grepl("v", names(df))))

更通用的方法:

apply(subset(df, select=grepl("v", names(df))), 1, sum)