我有一个数据框,其中列的名称类似于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元素的总和。
答案 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)