有一些小细节你可以留意一下。
a$X1 和 a["X1"] 和 a[X1] 三者是不同的。
a$X1 同于 a[["X1"]] 回传的是向量;
a["X1"] 回传的是 data frame;
a[X1] 要预先定义 X1 的值才有作用(这是实际你发生的问题)。
综合以上,改成:
reorder_level <- function(df, col_name) {
df[col_name] <-
factor(df[[col_name]], levels = mixedsort(unique(df[[col_name]])))
df
}
b <- a %>% reorder_level("X1")
b
b$X1
重点在于双重中括号和 "X1" 而不是 X1
※ 引述《tus (new life)》之铭言:
: [问题类型]:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
: [软件熟悉度]:
: 使用者(已经有用R 做过不少作品)
: [问题叙述]:
: 主要目的是重新排列一个factor level的顺序
: 我的问题是 如何能用pipe的表示方法来做到
: [程式范例]:
: library(dplyr)
: library(gtools)
: rm(list = ls())
: a <- data.frame(matrix(c("b_1","b_2","b_3","b_10","b_2",1,2,3,4,5), nrow = 5))
: a$X1 <- as.character(a$X1)
: levels(as.factor(a$X1)) # "b_1" "b_10" "b_2" "b_3"
: # 假设 a 是我们的资料 因为原始资料的型态是 chr 所以我把 a$X1 转成chr
: # 这样的level排序是 b_1, b_10, b_2, ...
: # 但我想要的是 b_1, b_2, b_3, b_10
: b <- a
: b$X1 <- factor(b$X1, levels = mixedsort(unique(b$X1)))
: levels(b$X1) # "b_1" "b_2", "b_3", "b_10"
: # 所以我用了以上程式来改变level的顺序
: # 可是当我写了一个reorder level的function 想使用pipe时 却一直出现问题
: reorder_level <- function(df, col_name){
: df[col_name] <- factor(df[col_name], levels = mixedsort(unique(df[col_name])))
: df
: }
: c <- a %>% reorder_level(X1)
: # Error message 是
: # Error in [.data.frame (df, col_name) : object 'X1' not found]
: Thanks!