在for
的{{1}}循环中,我创建了不同的数据帧并对它们执行一些操作。我需要做的最后一个操作是将一个额外的列添加到数据帧中,并以前三列的平均值作为参数。
我的(示例)代码是:
R
但是,不是创建新列for(comparison in c("A_N_vs_T", "A_N_vs_B", "A_N_vs_BT", "A_N_vs_Nprobes",
"B_N_vs_T","B_N_vs_B","B_N_vs_BT","B_N_vs_Nprobes")){
DO SOME OPERATIONS
assign(paste0("Norm_counts_",comparison,"$N_mean"), rowMeans(eval(parse(text=paste0("Norm_counts_",comparison)))[,c(1,2,3)],na.rm = T))
}
,而是创建一个新变量(例如N_mean
),该变量存储平均值。
是否可以更改Norm_counts_A_N_vs_T$N_mean
的这种行为?
谢谢
答案 0 :(得分:2)
首先,获取要对其进行操作的data.frames的字符向量:
input.df <- unique(merge(df1, df2[c("INPUT_MEASUREMENT")],
by.x="MEASUREMENT", by.y="INPUT_MEASUREMENT"))
output.df <- unique(merge(df1, df2[c("OUTPUT_MEASUREMENT")],
by.x="MEASUREMENT", by.y="OUTPUT_MEASUREMENT"))
library(dplyr)
df3 <- df2 %>%
mutate(DELTA_AVERAGE = abs((OUTPUT_AVERAGE * output.df$MULTIPLIER) -
(INPUT_AVERAGE * input.df$MULTIPLIER)),
DELTA_TARGET = abs((OUTPUT_TARGET * output.df$MULTIPLIER) -
(INPUT_TARGET* input.df$MULTIPLIER)))
第二,编写一个执行所需操作的函数。
此特定函数将data.frame的名称作为字符串,并返回具有新列“ rowmeans”的data.frame(作为对象),该列包含前三列的行平均值。
# either specify it yourself
df_names <- c("df_one", "df_two")
# or get all data.frames in the global environment
temp <- x=sapply(ls(), function(x) is.data.frame(get(x)))
df_names <- names(temp)[temp==TRUE]
最后,循环遍历data.frame名称,对每个函数应用该函数,然后使用add_rowmeans <- function(df_as_str) {
# get the obj the str refers to
df <- eval(as.name(df_as_str))
# add a column with rowmeans of cols 1-3
df$rowmeans <- rowMeans(df[,1:3])
# return df with new column as output
return(df)
}
保存结果:
assign
我在这两个data.frames上对此进行了测试:
for(i in seq_along(df_names)) {
this_df_name <- df_names[i]
assign(this_df_name, add_rowmeans(this_df_name))
}