【发布时间】:2011-09-13 09:25:37
【问题描述】:
我有一个数据框,其中列的名称类似于 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 元素的总和。
【问题讨论】:
我有一个数据框,其中列的名称类似于 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 元素的总和。
【问题讨论】:
names 上的grep 获取列位置,然后使用rowSums:
rowSums(df[,grep("v",names(df))])
【讨论】:
df[grep("v",names(df))] 避免转换为向量。比较 df[,"v1"] 与 df["v1"]。
结合@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 更好。
【讨论】:
应该这样做:
df$sums<- rowSums(subset(df, select=grepl("v", names(df))))
对于更通用的方法:
apply(subset(df, select=grepl("v", names(df))), 1, sum)
【讨论】: