我想对一些列中的值应用一些操作,然后对每列的结果求和。我可以这样做:
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
)。
非常感谢!
答案 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))