如何在R中对列进行操作和求和?

时间:2015-01-23 14:47:29

标签: r

我想对一些列中的值应用一些操作,然后对每列的结果求和。我可以这样做:

x <- data.frame(sample=1:3, a=4:6, b=7:9)
x$a2 <- x$a^2
x$b2 <- x$b^2
x$result <- x$a2 + x$b2

但是很多专栏都会变得艰难,我想知道是否有人能提出更简单的方法。请注意,数据框包含我不希望包含在计算中的其他列(在此示例中,不包括列sample)。

非常感谢!

6 个答案:

答案 0 :(得分:8)

我会简单地对感兴趣的列进行子集化,并使用rowSums函数将所有内容直接应用于矩阵。

x <- data.frame(sample=1:3, a=4:6, b=7:9)

# put column indices and apply your function
x$result <- rowSums(x[,c(2,3)]^2)

这当然假设您的功能是矢量化的。如果没有,您需要使用一些apply变体(您可以看到很多变体)。也就是说,如果您发现它有用,您仍然可以使用rowSums。注意,我使用sapply也返回一个矩阵。

# random custom function
myfun <- function(x){
    return(x^2 + 3)
}

rowSums(sapply(x[,c(2,3)], myfun))

答案 1 :(得分:1)

您可以使用应用功能。并使用c(i1,i2,..,etc)获取所需的列。

apply(( x[ , c(2, 3) ])^2, 1 ,sum )

答案 2 :(得分:1)

我建议将数据集转换为“long”格式,按sample对其进行分组,然后计算结果。以下是使用data.table的解决方案:

library(data.table)
melt(setDT(x),id.vars = 'sample')[,sum(value^2),by=sample]
#   sample  V1
#1:      1  65
#2:      2  89
#3:      3 117

您可以轻松地用您想要的任何函数替换值^ 2.

答案 3 :(得分:1)

如果要将名为somefunction的函数应用于某些列,其索引或列号位于向量col_indices中,然后对结果求和,则可以执行以下操作:

# if somefunction can be vectorized :
x$results<-apply(x[,col_indices],1,function(x) sum(somefunction(x)))

# if not :
x$results<-apply(x[,col_indices],1,function(x) sum(sapply(x,somefunction)))

答案 4 :(得分:1)

我想从“没有延伸”的R POV来到​​这个。

记住您正在使用哪种数据结构非常重要。数据帧实际上是矢量列表 - 每列本身就是一个矢量。因此,您可以使用方便的lapply函数将函数应用于列表/数据框中的所需列。

我将如上所述将函数定义为正方形,但当然这可以是任何复杂度的任何函数(只要它将向量作为输入并且返回向量的向量)相同的长度。如果没有,它将不适合原始data.frame!

下面的步骤是额外的迂腐,以显示每一点,但显然它可以压缩成一个或两个步骤。请注意,我只保留每列的平方和,因为如果您处理大量数据,可能需要节省内存空间。

  • 创建数据;定义功能

  • 将您想要的列作为单独的(临时)data.frame

  • 抓取
  • 将该函数应用于刚刚创建的data.frame / list。

  • lapply返回一个列表,所以如果你打算保留它,请单独将它作为临时data.frame。这不是必需的。

  • 计算临时data.frame行的总和,并将其作为x中的新列附加。

  • 删除临时数据。表。

代码:

x <- data.frame(sample=1:3, a=4:6, b=7:9); square <- function(x) x^2 #step 1

x[2:3] #Step 2

temp <- data.frame(lapply(x[2:3], square)) #step 3 and step 4

x$squareRowSums <- rowSums(temp) #step 5

rm(temp) #step 6

答案 5 :(得分:0)

这是另一个适用的解决方案

cols <- c("a", "b")
x <- data.frame(sample=1:3, a=4:6, b=7:9)
x$result <- apply(x[, cols], 1, function(x) sum(x^2))