【问题标题】:R, create a new column in a data frame that applies a function of all the columns with similar namesR,在数据框中创建一个新列,该列应用具有相似名称的所有列的函数
【发布时间】: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 元素的总和。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

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

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

    【讨论】:

    • 如果只选择一列,请使用df[grep("v",names(df))] 避免转换为向量。比较 df[,"v1"]df["v1"]
    【解决方案2】:

    结合@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 更好。

    【讨论】:

      【解决方案3】:

      应该这样做:

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

      对于更通用的方法:

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

      【讨论】:

        猜你喜欢
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        • 2021-02-10
        • 2018-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多