我想编写一个按列排序的函数。这个基本练习当然多次被问过,但是解决方案建议depend on the literal,因此不能在函数中使用(here,there和there ),或者需要dependence on the column ordering,这使得编程变得脆弱(here)。
我正在寻找的东西显然被称为“参考透明度”。精细。但似乎采用这个术语,至少在本例中,会导致using very many words定义和区分程序中的文字。因此MWE是最好的。
函数sort.by.column
的正文应该包含什么,以便
sort.by.column <- function(df, column.name) {
## ??
}
df1 <- data.frame(Instrument=c("B","A"),
Value=c(3,2))
df2 <- data.frame(Device=c("D","C"),
Value=c(5,4))
column.name.1 <- "Instrument"
sorted1 <- sort.by.column(df1, column.name.1)
column.name.2 <- "Device"
sorted2 <- sort.by.column(df2, column.name.2)
适用于df1
和df2
?
答案 0 :(得分:1)
以下是dplyr::arrange
采用文字的包装器:
library(dplyr)
sort.by.column <- function(df, column.name) {
col <- sym(column.name)
arrange(df, !!col)
}
答案 1 :(得分:0)
您可以使用sum-9
将函数sort.by.column
编写为:
order
数据:强>
sort.by.column <- function(df, column.name) {
df[order(df[,column.name]),]
}
#Lets test the function
sort.by.column(df1, "Value")
# Instrument Value
# 2 B 2
# 1 A 3
sort.by.column(df2, "Value")
# Device Value
# 2 D 4
# 1 C 5
sort.by.column(df1, "Instrument")
# Instrument Value
# 1 A 3
# 2 B 2
sort.by.column(df2, "Device")
# Device Value
# 1 C 5
# 2 D 4
<强>解释强>
它的工作原理如下。初始化
df1 <- data.frame(Instrument=c("A","B"),
Value=c(3,2))
df2 <- data.frame(Device=c("C","D"),
Value=c(5,4))
表达式
df <- data.frame(Instrument=c("B","A"), Value=c(3,2))
col.name <- "Instrument"
返回数据帧的1列子集。表达式
df[,col.name]
对该子集进行排序,返回行的索引。最后
order(df[,col.name])
返回数据帧的行子集,其中行索引按计算顺序。
答案 2 :(得分:0)
我在这里收集确认,比较和理解的解决方案。
s1 <- function(df, column.name) {
#library(dplyr)
dplyr::arrange_(df, column.name)
}
# version which does not require a `library(dplyr)` call
a50915367 <- function(df, column.name) {
# library(dplyr)
col <- rlang::sym(column.name) # dplyr::sym also works
dplyr::arrange(df, rlang::`!!`(col))
}
library(dplyr) # required before function
a50915367 <- function(df, column.name) {
col <- sym(column.name)
arrange(df, !!col)
}
a50915313 <- function(df, column.name) {
df[order(df[,column.name]),]
}
f <- function(sorting.function) {
df1 <- data.frame(Instrument=c("B","A"), Value=c(3,2))
df2 <- data.frame(Device=c("D","C"), Value=c(5,4))
column.name.1 <- "Instrument"
sorted1 <- sorting.function(df1, column.name.1)
column.name.2 <- "Device"
sorted2 <- sorting.function(df2, column.name.2)
ret.list <- list(r1=sorted1,
r2=sorted2)
ret.list
}
g <- function() {
cat("----------------1----------------\n")
print(f(s1))
cat("----------------a50915367----------------\n")
print(f(a50915367))
cat("----------------a50915313----------------\n")
print(f(a50915313))
}
g()