【问题标题】:Rank observation by a group based on a dynamic variable name根据动态变量名称按组对观察进行排名
【发布时间】:2017-07-30 12:52:56
【问题描述】:

我有一个包含一个组列和几个数字列的数据框。此外,我有一个变量存储我需要对观察进行排名的列名。说这是我的数据框

> x = "myValue1"
> set.seed(123)
> df = data.frame(myValue1 = rnorm(9, mean = 10),
                  myValue2 = rnorm(9, mean = 2),
                  myGroup = rep(c("a","b","c"), each = 3), 
                  myEntity = paste0("entity",1:9))
> df
   myValue1   myValue2 myGroup myEntity
1  9.439524 1.55433803       a  entity1
2  9.769823 3.22408180       a  entity2
3 11.558708 2.35981383       a  entity3
4 10.070508 2.40077145       b  entity4
5 10.129288 2.11068272       b  entity5
6 11.715065 1.44415887       b  entity6
7 10.460916 3.78691314       c  entity7
8  8.734939 2.49785048       c  entity8
9  9.313147 0.03338284       c  entity9

我想要的是在每个组中使用来自x 的列(在本例中为myValue1)返回每个观察的排名。所以,我想返回以下数据框

 > library(dplyr)
 > df = data.frame(df %>% 
                   group_by(myGroup) %>% 
                   mutate(myRank = order(myValue1,myEntity)))
 > df
       myValue1   myValue2 myGroup myEntity myRank
    1  9.439524 1.55433803       a  entity1      1
    2  9.769823 3.22408180       a  entity2      2
    3 11.558708 2.35981383       a  entity3      3
    4 10.070508 2.40077145       b  entity4      1
    5 10.129288 2.11068272       b  entity5      2
    6 11.715065 1.44415887       b  entity6      3
    7 10.460916 3.78691314       c  entity7      2
    8  8.734939 2.49785048       c  entity8      3
    9  9.313147 0.03338284       c  entity9      1

这很简单,因为我输入了列名。我的问题是如何使用变量 x 而不是在此公式中键入列名。 这是我尝试但没有成功的方法(它们都返回错误)

> df = data.frame(df %>% group_by(myGroup) %>% mutate(myRank = order(x,myEntity)))
> df = data.frame(df %>% group_by(myGroup) %>% mutate(myRank = order(as.name(x),myEntity)))
> df = data.frame(df %>% group_by(myGroup) %>% mutate(myRank = order(noquote(x),myEntity)))
> library(plyr)
> df = ddply(df,.(myGroup),transform,Order = rank(as.name(x)))

我也在这里查看了similar question 的问题,但无法使其适用于我的场景。

【问题讨论】:

  • 如果您将rlang 中的取消引用运算符UQ() 包裹在它周围,您使用as.name() 的方法将起作用

标签: r


【解决方案1】:

您可以使用.data 代词来指代带有字符串的变量:

x <- "myValue1"

df %>% 
  group_by(myGroup) %>% 
  mutate(myRank = order(.data[[x]], myEntity))

或使用rlang 中的sym() 和取消引用运算符UQ()

df %>% 
  group_by(myGroup) %>% 
  mutate(myRank = order(UQ(rlang::sym(x)), myEntity))

【讨论】:

  • 这很棒。谢谢史蒂文。
猜你喜欢
  • 2016-04-30
  • 2020-12-15
  • 2017-12-23
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
相关资源
最近更新 更多