在paste0内的数据框中添加新列

时间:2018-07-25 16:56:46

标签: r dataframe

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的这种行为?

谢谢

1 个答案:

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