簡體   English   中英

如何通過字符變量在ddply中指定列名?

[英]How to specify a column name in ddply via character variable?

我有一個 tibble/dataframe

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

我正在嘗試下面的命令; 如果給出列的名稱,它就可以工作,但我無法通過狀態字符變量傳遞名稱。 我嘗試了ensym(state)!!ensym(state) ,但它們都在拋出錯誤。

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))

請注意,語法將為您提供每個唯一的sample_id - condition對的值。 這在您的示例中不是問題,因為每個sample_id都具有相同的condition ,但只是需要注意的事項。

關於你的問題......我不太清楚你打算如何將州名傳遞給你的計算。 但是有幾種方法可以處理這個問題。 一種是使用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

感謝大家努力回答我的問題。 根據您的建議,我找到了解決方案。 下面是我試圖通過將sample_idcondition分組並通過變量傳遞state來實現的代碼。

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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM