假设我有这个数据框:
df <- data.frame(A = letters[1:5],
B = letters[6:10],
stringsAsFactors = FALSE)
A B
1 a f
2 b g
3 c h
4 d i
5 e j
我正在寻找此输出的地方:
A B
1 e j
2 d i
3 c h
4 b g
5 a f
具有此功能:
f_Order <- function(df){
df$Order <- as.integer(row.names(df))
df <- arrange(df, desc(Order))[,c("A","B")]
}
尽管上面的函数不起作用,但是函数内部的代码可以完美地工作:
df$Order <- as.integer(row.names(df))
df <- arrange(df, desc(Order))[,c("A","B")]
> x
A B
1 e j
2 d i
3 c h
4 b g
5 a f
为什么?如何使该功能起作用?
编辑:
为澄清起见,问题说明不是不是要更改df的顺序,而是要使功能f_Order
起作用。该代码可以实现我想要的功能,但是却不是我想要的功能。我需要知道为什么以及如何使该功能正常工作。
EDIT2:
这正是我正在运行的代码,仍然无法使用任何解决方案。
x <- data.frame(A = letters[1:5],
B = letters[6:10],
stringsAsFactors = FALSE)
f_Order <- function(df){
df$Order <- as.integer(row.names(df))
df <- arrange(df, desc(Order))
return(df)
}
f_Order(x)
答案 0 :(得分:4)
如果函数结尾处带有return()
,该怎么办?像这样:
f_Order <- function(df){
df$Order <- as.integer(row.names(df))
df <- arrange(df, desc(Order))[,c("A","B")]
return(df)
}
基本上,如果函数中发生任何事情,如果希望有输出,则需要在最后将其返回。否则,它只是...在函数内部执行,而不是在更广泛的环境中执行,然后什么都不显示。
输出:
> f_Order(df)
A B
1 e j
2 d i
3 c h
4 b g
5 a f
如果要更新df,请运行df <- f_Order(df)
。
答案 1 :(得分:2)
继续dplyr
:
f_Order <- function(df){
#df$Order <- as.integer(row.names(df))
df %>%
mutate(Order=row.names(.)) %>%
arrange(desc(Order))
}
如果我们不想保留Order
:
f_Order <- function(df){
df %>%
arrange(desc(row.names(.)))
}
结果:
f_Order(df)
A B
1 e j
2 d i
3 c h
4 b g
5 a f