R 如何通过字符变量在ddply中指定列名?

R 如何通过字符变量在ddply中指定列名?,r,dplyr,plyr,rlang,tidyeval,R,Dplyr,Plyr,Rlang,Tidyeval,我有一个带有 sample_id condition state --------------------------------- sample1 case val1 sample1 case val2 sample1 case val3 sample2 control val1 sample2 control val2 sample2

我有一个带有

sample_id     condition     state
---------------------------------
sample1       case          val1
sample1       case          val2
sample1       case          val3
sample2       control       val1
sample2       control       val2
sample2       control       val3
数据帧是在for循环中为不同状态生成的。因此,每个数据帧的状态列都有不同的名称

我想按sample_id对数据进行分组,并计算state列的中位数,这样每个唯一的sample_id都有一个中位数。输出应该如下所示

sample_id     condition     state
---------------------------------
sample1       case          median
sample2       control       median
我正在尝试下面的命令;如果给定列的名称,它是有效的,但是我无法通过state字符变量传递名称。我试过ensymstate和!!但他们都在抛出错误

ddply(dat_state, .(sample_id), summarize,  condition=unique(condition), state_exp=median(ensym(state)))

正如卡米尔在上面所指出的,这在dplyr中更容易实现。基本语法尚未解决您的问题:

my_df %>% 
  group_by(sample_id, condition) %>% 
  summarize(state = median(state))
注意,语法将为每个唯一的示例id条件对提供值。在您的示例中,这不是一个问题,因为每个示例id都有相同的条件,但只是需要注意一些事情

关于你的问题。。。我不太清楚你打算如何把州名传给你的计算。但有几种方法可以解决这个问题。一种是使用dplyr的重命名功能:

x <- "Massachusetts"
my_df %>% 
  rename(state = x) %>% 
  group_by(sample_id, condition) %>% 
  summarize(state = median(state))
可能更合适的方法是使用dplyr的tidyeval语法编写函数:

myfunc <- function(df, state_name) {
  df %>% 
    group_by(sample_id, condition) %>% 
    summarize(state = median({{state_name}}))
}

myfunc(my_df, Massachusetts) # Note: Unquoted state name

谢谢大家努力回答我的问题。根据你的建议,我找到了解决办法。下面是我试图通过将样本id和条件分组并通过变量传递状态来实现的代码

state_mark <- c("pPCLg2", "STAT1", "STAT5", "AKT")

for(state in state_mark){
    dat_state <- dat_clust_stim[,c("sample_id", "condition", state)]

    # I had to use !!ensym() to convert a character to a symbol.
    dat_med <- group_by(dat_state, sample_id, condition) %>% 
               summarise(med = median(!!ensym(state)))

    dat_med <- ungroup(dat_med)
    x <- dat_med[dat_med$condition == "case", "med"]
    y <- dat_med[dat_med$condition == "control", "med"]
    t_test <- t.test(x$med, y$med)
}

只是想指出,ddply来自plyr,它已经被弃用了几年了。可以使用dplyr函数实现这一点:只需按前两列分组,并将第三列汇总为中间值。要使用列名作为变量执行类似操作,可以在函数中使用tidyeval。你试着用x这样的东西来做,这能回答你的问题吗@卡米尔·普莱尔并没有遭到反对。它已退役,这意味着我们将继续在CRAN上无限期地维护它,而不添加新功能。@LionelHenry是的,我使用了错误的术语。但是,鼓励人们转向取而代之的软件包是公平的,对吧?是的,完全公平,尤其是对于新的软件包和脚本。我只是想确保人们不会误以为plyr很快就会从CRAN消失。