r - 使用与表达式对应的字符向量作为函数的参数

标签 r dataframe

我有以下代码,

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/

相关文章:

r - 将 rpy2 与 Pandas 数据框一起使用

r - psych:主要 - 加载组件

python - 连接已旋转的 Dataframe 中的两列

python - 保留 pandas df 的行在给定列中包含给定列表中的子字符串

python - 计算数据帧中记录之间的增量时间

R:从其他表创建值矩阵

r - 在 R 中安装 Cairo 包的错误消息

r - 在 R 中使用 OR 条件和字符串进行子集化

r - kernlab 中的 kernelMatrix 函数不返回任何内容

Pandas:将两个数据框列组合在一个排序列中