对R数据帧中的大量列调用函数 作为输入,在数据帧中考虑99个名为P01到P99的列。 在本例中,我将使用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 P01P02P03P04P05P06 14 76 153 155 163 175 85 89 105 155 166 167 15 26 167 257 313 318 2 105 162 171 177 221

对R数据帧中的大量列调用函数 作为输入,在数据帧中考虑99个名为P01到P99的列。 在本例中,我将使用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 P01P02P03P04P05P06 14 76 153 155 163 175 85 89 105 155 166 167 15 26 167 257 313 318 2 105 162 171 177 221 ,r,dataframe,R,Dataframe,作为输出,我们需要一个新的列“result”,它将这些列粘贴在一起,以“-”分隔,如下所示: p01 p02 p03 p04 p05 p06结果 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-22

作为输出,我们需要一个新的列“result”,它将这些列粘贴在一起,以“-”分隔,如下所示:
p01 p02 p03 p04 p05 p06结果
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")
mini=structure(列表)(p01=c(14,85,15,2),p02=c(76,89,26,105
),p03=c(153105167162),p04=c(155155257171),
p05=c(163166 31313177P06=c(175167318221)),
.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){
返回(粘贴(v1、v2、v3、v4、v5、v6、sep=“-”)
}
vmyhash=矢量化(myhash)
迷你$result=vmyhash(迷你$p01,迷你$p02,
迷你$p03,迷你$p04,
迷你$p05,迷你$p06)

您还可以直接在
apply(…)
中定义“匿名”函数:

您还可以直接在
apply(…)
中定义“匿名”函数:


这是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" 
>(m1-f1(应用(m1,1,f1))
x1-x2
"1-2-9-10" "1-2-8-10" 

这是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" 
>(m1-f1(应用(m1,1,f1))
x1-x2
"1-2-9-10" "1-2-8-10" 

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

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

mini$result下面是另一种将值粘贴在一起的简单方法:

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

mini$result能否将其修改为一个用户定义的函数,该函数包含大量参数?能否澄清一点。这将创建一个“散列”,将所有列中的值粘贴在一起,以“-”分隔。是否需要其他内容?我正在寻找一个更一般的答案,而不是“粘贴”我们调用一个用户定义的函数。例如,如果您希望在进行哈希之前对值进行排序,使p01是最小的数字,p06是最大的数字,该怎么办(假设在示例中它们尚未排序)@DanGoldstein您可以将用户定义的函数传递给
apply
。研究帮助页面并查看其中的示例。是否可以将其修改为使用包含大量参数的用户定义函数?能否澄清一点。这将创建一个“散列”,将所有列中的值粘贴在一起,以“-”分隔。你想要不同的吗?我在寻找一个更一般的答案,因此我们不调用“粘贴”而是调用一个用户定义的函数。例如,如果你想在进行哈希之前对值进行排序,使p01是最小的数字,p06是最大的数字,该怎么办(假设在示例中它们尚未排序)@DanGoldstein您可以将用户定义的函数传递给
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"
> (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" 
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