R:根据具有重复值的数值向量重新排序级别
R: reorder levels according to numeric vector with duplicate values
根据向量重新排序数据框(例如为了正确 ggplot2
绘图)已经进行了多次,例如在这个不错的线程 here 中。然而,我无法让它工作——也许是因为某些值是重复的(至少这是 R 的警告是关于什么的)。使用 dplyr 的玩具示例:
require(dplyr)
set.seed(8)
df <- tbl_df(data.frame(
v1 = rnorm(8),
v2 = rep(rnorm(4),2),
v3 = rep(sample(LETTERS[],4),2)))
v1
仅在此处,以便所有列可能不同。 v3
的水平现在是
levels(df$v3)
[1] "A" "B" "C" "D"
我想根据包含重复值的 v2
重新排序 v3
。
df[order(df$v2),"v2"][[1]]
[1] -3.0110517 -3.0110517 -0.7597938 -0.7597938 -0.5931743 -0.5931743 0.2920499 0.2920499
这怎么行不通? :
df %>%
mutate(v3 = factor(v3, levels=df[order(df$v2),"v2"][[1]]))
更新:
这也不起作用:
df %>%
mutate(v3 = factor(v3, levels=unique(df[order(df$v2),"v2"][[1]])))
给出:
v1 v2 v3
1 -0.08458607 -3.0110517 NA
2 0.84040013 -0.5931743 NA
3 -0.46348277 -0.7597938 NA
4 -0.55083500 0.2920499 NA
5 0.73604043 -3.0110517 NA
6 -0.10788140 -0.5931743 NA
7 -0.17028915 -0.7597938 NA
8 -1.08833171 0.2920499 NA
要避免 "duplicate" 警告并在 v3
上创建一个有序因子(按 v2
排序),您可以这样做:
df %>%
mutate(v3 = factor(v3,
ordered=TRUE,
levels=unique(df[order(df$v2),"v3"][[1]])))
根据向量重新排序数据框(例如为了正确 ggplot2
绘图)已经进行了多次,例如在这个不错的线程 here 中。然而,我无法让它工作——也许是因为某些值是重复的(至少这是 R 的警告是关于什么的)。使用 dplyr 的玩具示例:
require(dplyr)
set.seed(8)
df <- tbl_df(data.frame(
v1 = rnorm(8),
v2 = rep(rnorm(4),2),
v3 = rep(sample(LETTERS[],4),2)))
v1
仅在此处,以便所有列可能不同。 v3
的水平现在是
levels(df$v3)
[1] "A" "B" "C" "D"
我想根据包含重复值的 v2
重新排序 v3
。
df[order(df$v2),"v2"][[1]]
[1] -3.0110517 -3.0110517 -0.7597938 -0.7597938 -0.5931743 -0.5931743 0.2920499 0.2920499
这怎么行不通? :
df %>%
mutate(v3 = factor(v3, levels=df[order(df$v2),"v2"][[1]]))
更新: 这也不起作用:
df %>%
mutate(v3 = factor(v3, levels=unique(df[order(df$v2),"v2"][[1]])))
给出:
v1 v2 v3
1 -0.08458607 -3.0110517 NA
2 0.84040013 -0.5931743 NA
3 -0.46348277 -0.7597938 NA
4 -0.55083500 0.2920499 NA
5 0.73604043 -3.0110517 NA
6 -0.10788140 -0.5931743 NA
7 -0.17028915 -0.7597938 NA
8 -1.08833171 0.2920499 NA
要避免 "duplicate" 警告并在 v3
上创建一个有序因子(按 v2
排序),您可以这样做:
df %>%
mutate(v3 = factor(v3,
ordered=TRUE,
levels=unique(df[order(df$v2),"v3"][[1]])))