对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
作为输出,我们需要一个新的列“result”,它将这些列粘贴在一起,以“-”分隔,如下所示:对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
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