如何通过字符变量在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
对数据进行分组并计算状态列的中位数,以便每个唯一的 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)))
正如 camille 上面所说,这在 dplyr 中更容易。基本语法(尚未解决您的问题):
my_df %>%
group_by(sample_id, condition) %>%
summarize(state = median(state))
请注意,语法将为每个唯一的 sample_id
-condition
对提供值。这在您的示例中不是问题,因为每个 sample_id
都具有相同的 condition
,但需要注意一些事情。
关于您的问题...我不太清楚您打算如何将州名传递给您的计算。但是有几种方法可以解决这个问题。一种是使用dplyr的"rename"函数:
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_id
和 condition
并通过变量传递 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)
}
我有一个 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
对数据进行分组并计算状态列的中位数,以便每个唯一的 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)))
正如 camille 上面所说,这在 dplyr 中更容易。基本语法(尚未解决您的问题):
my_df %>%
group_by(sample_id, condition) %>%
summarize(state = median(state))
请注意,语法将为每个唯一的 sample_id
-condition
对提供值。这在您的示例中不是问题,因为每个 sample_id
都具有相同的 condition
,但需要注意一些事情。
关于您的问题...我不太清楚您打算如何将州名传递给您的计算。但是有几种方法可以解决这个问题。一种是使用dplyr的"rename"函数:
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_id
和 condition
并通过变量传递 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)
}