在R
的for
循环中,我创建了不同的数据帧并对它们执行了一些操作。我需要的最后一个操作是用前三列的平均值将额外的一列附加到数据帧中。
我的(示例)代码是:
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
的变量,它在其中存储平均值。
是否可以更改paste0
的此行为
谢谢
发布于 2018-07-25 17:17:23
首先,获取要对其进行操作的data.frames的字符向量:
# 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的名称,并返回data.frame (作为对象)和名为" rowmeans“的新列,该列包含前3列的行均值。
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)
}
最后,循环遍历您的data.frame名称,对每个名称应用该函数,并使用assign
保存结果
for(i in seq_along(df_names)) {
this_df_name <- df_names[i]
assign(this_df_name, add_rowmeans(this_df_name))
}
我在这两个data.frames上进行了测试:
set.seed(1234)
df1 <- as.data.frame(matrix(sample(1:9, 30, T), nrow=10))
df2 <- as.data.frame(matrix(sample(1:9, 30, T), nrow=10))
https://stackoverflow.com/questions/51524152
复制相似问题