作为输入,请考虑数据帧中名为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)
答案 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