使用循环中的变量调用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"))