在R数据帧中的大量列上调用函数

时间:2014-02-08 03:38:02

标签: r dataframe

作为输入,请考虑数据帧中名为p01到p99的99列。 我将在此示例中使用6来保持其可管理性。

p01 p02 p03 p04 p05 p06
14  76 153 155 163 175
85  89 105 155 166 167
15  26 167 257 313 318
 2 105 162 171 177 221

作为输出,我们需要一个新列“结果”,将这些列粘贴在一起,用“ - ”分隔,如下所示:

p01 p02 p03 p04 p05 p06                result
14  76 153 155 163 175 14-76-153-155-163-175
85  89 105 155 166 167 85-89-105-155-166-167
15  26 167 257 313 318 15-26-167-257-313-318
 2 105 162 171 177 221 2-105-162-171-177-221

重现此数据结构的代码是

 mini=structure(list(p01 = c(14, 85, 15, 2), p02 = c(76, 89, 26, 105
), p03 = c(153, 105, 167, 162), p04 = c(155, 155, 257, 171), 
p05 = c(163, 166, 313, 177), p06 = c(175, 167, 318, 221)), 
.Names = c("p01", "p02", "p03", "p04", "p05", "p06"), 
row.names = c(NA, 4L), class = "data.frame")

下面是一种方法,但它需要在函数定义中命名6个变量,在函数调用中命名6个变量。这不会扩展到99或999列。如何在数据框中的大量列上定义和调用函数?

myhash=function(v1,v2,v3,v4,v5,v6) {
  return(paste(v1,v2,v3,v4,v5,v6,sep="-"))
}
vmyhash=Vectorize(myhash)
mini$result=vmyhash(mini$p01, mini$p02,
                   mini$p03, mini$p04,
                   mini$p05, mini$p06)

3 个答案:

答案 0 :(得分:2)

mini$result <- apply(mini,1,paste,collapse="-")

编辑(对OP评论的回应)

正如@Roland所指出的,你可以将任何函数传递给apply(...),包括UDF。所以

f <- function(x) paste(x[order(x)],collapse="-")
mini$result <- apply(mini,1,f)

您还可以直接在apply(...)

中定义“匿名”功能
mini$result <- apply(mini,1,function(x) paste(x[order(x)],collapse="-"))

这个更短但是使代码更难阅读。

最后,这里按相反顺序排序,只是为了表明它正在做某事:

apply(mini,1,function(x) paste(x[order(-x)],collapse="-"))
# [1] "175-163-155-153-76-14" "167-166-155-105-89-85" "318-313-257-167-26-15" "221-177-171-162-105-2"

答案 1 :(得分:1)

这是jlhowards答案的扩展,应该接近你想要的。评论太长了......

> (m1 <- t(data.frame(x1=c(1,2,10,9),
+                  x2=c(8,10,1,2))))
   [,1] [,2] [,3] [,4]
x1    1    2   10    9
x2    8   10    1    2
> f1 <- function(x) paste(sort(x), collapse="-")
> (apply(m1, 1, f1))
        x1         x2 
"1-2-9-10" "1-2-8-10" 

答案 2 :(得分:1)

以下是将值粘贴在一起的另一种简单方法:

mini$result <- gsub(" ", "-", Reduce(paste, mini))

  p01 p02 p03 p04 p05 p06                result
1  14  76 153 155 163 175 14-76-153-155-163-175
2  85  89 105 155 166 167 85-89-105-155-166-167
3  15  26 167 257 313 318 15-26-167-257-313-318
4   2 105 162 171 177 221 2-105-162-171-177-221