使用循环中的变量调用R中的数据
我有几个数据帧,希望在循环中处理它们。因此,我尝试使用包含帧名称的变量调用帧。如何使用变量来寻址数据帧?或者通常将变量的内容作为表达式使用循环中的变量调用R中的数据,r,ggplot2,R,Ggplot2,我有几个数据帧,希望在循环中处理它们。因此,我尝试使用包含帧名称的变量调用帧。如何使用变量来寻址数据帧?或者通常将变量的内容作为表达式 # 38 data frames all named ExperimentX, with X 1:38 for(i in 1:38) { nextDataFrame <- paste0("Experiment",i) Collection$paste0("Experiment",i) <- nextDataFrame } (这是我的第一篇帖
# 38 data frames all named ExperimentX, with X 1:38
for(i in 1:38) {
nextDataFrame <- paste0("Experiment",i)
Collection$paste0("Experiment",i) <- nextDataFrame
}
(这是我的第一篇帖子。)我不确定你的具体问题。据我所知,不推荐你尝试做什么。你应该把那些
data.frame
放在另一个R对象中。然后在这个对象中迭代,做你想做的每一个实验
我建议将dfs组合在一个列表中,然后使用lappy()
我使用了几个函数来解决我的问题,主要的发现是
get():
我如何告诉它将表达式指向的内容用作表达式
Plot1 <- ggplot()
ToDo <- c(1, 5, 3) # specifies dataframes to plot
counter <- length(ToDo)
while (counter!=0) {
NumberOfDataframe <- ToDo[counter]
nextExperiment <- paste0("Experiment", NumberOfDataframe)
Plot1 + geom_line(data = nextExperiment, aes(x = Position_mm, y = Force_N)))
counter <- counter - 1
}
get(x)
正是这样做的,它调用x所指向的内容
paste0()
仅在函数需要字符串时才起作用,但您可以使用变量paste0(“exp”,i,.csv”)
构建字符串
assign(string_var,read.csv())
在从循环中的csv文件批量创建数据帧时也很有用
# Batch import of range or chosen x.csv, x = 1,2,..
ToDo <- c(1:38)
for (i in 1:length(ToDo)) {
nextFileNr <- ToDo[i]
filePath <- paste0("Instron Daten/", nextFileNr, ".csv")
if (ToDo[i] < 10) { # produce exp01,.. for better sorting with ls()
ExpName <- paste0("exp0", nextFileNr)
} else {
ExpName <- paste0("exp", nextFileNr)
}
# assign(obj_with_name_contained, be_filled_with_content_of_this)
assign(ExpName, read.csv2(filePath, header = TRUE, skip = 53))
}
# Delete unwanted coloumns in all data frames using loop and get()
for(i in 1:length(ToDo)) {
if (ToDo[i] < 10) { # if exp1 make it exp01
tempPattern <- paste0("exp0",i)
} else {
tempPattern <- paste0("exp",i)
}
set(get(tempPattern), j = 6L, value = NULL) # delete col 6
}
# Tare measurement by shifting values with mean of first 1500 entries
for(i in 1:length(ToDo)) {
if (ToDo[i] < 10) {
tempPattern <- paste0("exp0",i)
} else {
tempPattern <- paste0("exp",i)
}
meanValue <- mean(get(tempPattern)[0:1500,"Kraft_N"])
for(i in 1:nrow(get(tempPattern))) {
set(get(tempPattern), j = "Kraft_N", i = i, value = (get(tempPattern)$Kraft_N[i] - meanValue))
}
}
# Batch place all in a list
listFW <- mget(ls(pattern = "exp"))
也许你应该先考虑用另一种方式来做。在
ggplot
编码中,geom\u行
函数建议所有数据。帧
都相同。在这种情况下,您真的应该将它们附加到一个单独的data.frame中,例如,bind_rows
,用一个附加的ID列标记它们来自哪个实验,例如,列ID值为X1:X38。你的geom_行
代码只需要添加一个aes(…,group=ID)
或aes(…,color=ID
就可以为每个实验添加新的数据行。我希望这对你来说更简单。我会尝试组合它们。有没有一种方法可以循环和迭代,而不是显式添加exp1,exp2,…expN?find get(),效果很好。a
# Batch import of range or chosen x.csv, x = 1,2,..
ToDo <- c(1:38)
for (i in 1:length(ToDo)) {
nextFileNr <- ToDo[i]
filePath <- paste0("Instron Daten/", nextFileNr, ".csv")
if (ToDo[i] < 10) { # produce exp01,.. for better sorting with ls()
ExpName <- paste0("exp0", nextFileNr)
} else {
ExpName <- paste0("exp", nextFileNr)
}
# assign(obj_with_name_contained, be_filled_with_content_of_this)
assign(ExpName, read.csv2(filePath, header = TRUE, skip = 53))
}
# Delete unwanted coloumns in all data frames using loop and get()
for(i in 1:length(ToDo)) {
if (ToDo[i] < 10) { # if exp1 make it exp01
tempPattern <- paste0("exp0",i)
} else {
tempPattern <- paste0("exp",i)
}
set(get(tempPattern), j = 6L, value = NULL) # delete col 6
}
# Tare measurement by shifting values with mean of first 1500 entries
for(i in 1:length(ToDo)) {
if (ToDo[i] < 10) {
tempPattern <- paste0("exp0",i)
} else {
tempPattern <- paste0("exp",i)
}
meanValue <- mean(get(tempPattern)[0:1500,"Kraft_N"])
for(i in 1:nrow(get(tempPattern))) {
set(get(tempPattern), j = "Kraft_N", i = i, value = (get(tempPattern)$Kraft_N[i] - meanValue))
}
}
# Batch place all in a list
listFW <- mget(ls(pattern = "exp"))
makeExpStrings <- function(ToDo) { # creating name strings for calling the chosen data
i <- integer(0) # initializing
chosenExpStrings <- character(0)
for (i in 1:length(ToDo)) { # get data specified in ToDo and append
nextFileNr <- ToDo[i]
if (ToDo[i] < 10) { # adapting to naming scheme of data
ExpName <- paste0("exp0", nextFileNr)
} else {
ExpName <- paste0("exp", nextFileNr)
}
chosenExpStrings<-append(chosenExpStrings, ExpName)
}
return(chosenExpStrings)
}
chosenExpStrings <- makeExpStrings(ToDo)
# combine all coloumns with identifier for coloring
combi <- bind_rows(listFW[chosenExpStrings], .id="expNr")
ggplot() +
geom_path(data = combi, size = 0.4, aes_string(x = "Position_mm", y = "Kraft_N", colour = "expNr"))