我有以下代码,
z <- data.frame(a=sample.int(10),b=sample.int(10),c=sample.int(10))
letter <- c("a","c","b") # this will be used as the argument to a function
vec <- unlist(lapply(1:length(letter),
function(x) cat(paste("z[[letter[",x,"]]],",sep=""))))
vec[length(vec)] <- paste("z[[letter[",length(vec),"]]]",sep="")
最后:
> vec
[1] "z[[letter[1]]]," "z[[letter[2]]]," "z[[letter[3]]]"
我想用
vec
对数据帧的行进行排序 z
,使用下面的代码,z.sort <- z[with(z, order(???)),]
如何获取字符向量
vec
被评估为 order
的参数?考虑到
letter
,是否有更好的方法来做到这一点? ,用于形成 vec
将是一个函数的参数?期望的输出是:
a b c
5 1 1 9
10 2 10 2
1 3 7 1
9 4 2 5
8 5 8 6
2 6 4 3
4 7 9 10
3 8 3 8
6 9 5 7
7 10 6 4
或作为
dput
输出:structure(list(a = 1:10, b = c(1L, 10L, 7L, 2L, 8L, 4L, 9L, 3L, 5L, 6L), c = c(9L, 2L, 1L, 5L, 6L, 3L, 10L, 8L, 7L, 4L)), .Names = c("a", "b", "c"), row.names = c(5L, 10L, 1L, 9L, 8L, 2L, 4L, 3L, 6L, 7L), class = "data.frame")
最佳答案
这是您想要的(使用不同的随机数据):
> z[do.call(order, z[,letter]),]
a b c
5 1 2 1
4 2 4 8
1 3 3 9
6 4 6 3
8 5 8 5
10 6 1 4
2 7 5 7
3 8 10 2
9 9 7 6
7 10 9 10
do.call
让我们向函数发送一个列表作为它的参数,所以我们可以重新排序 z
的列并将它们发送至 order
使用 do.call
,作为 data.frame
只是一种特殊的列表。在函数中没有问题:
my.reorder <- function(dat, cols) { dat[do.call(order, dat[,cols]),] }
关于r - 使用与表达式对应的字符向量作为函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10232195/