0

我是 R 语言的新手,所以我可能错过了一些东西……我试图在 for 循环中运行它。

假设 i<-1,parti1 是一个表。(数据框)

partin<-paste("parti", i, sep = "")
eval(parse(text = partin))["Time"] <- "1"

但是,它给出了一个错误

文件中的错误(文件名,“r”):无法打开连接另外:警告消息:在文件(文件名,“r”)中:无法打开文件'parti1':没有这样的文件或目录

但是当我这样做时它没有错误

eval(parse(text = partin))["Time"] 

或这个。

parti1["Time"]<-"1"

或这个。

parti1<-eval(parse(text = paste("time", i, sep = "")))

我不确定我是否做错了什么,或者我是否缺少任何东西。我不应该使用eval(parse(mystring))吗?如果是这样,我应该改用什么?

更新:

输入:旧表:

Name Gender Hobbies


name    F   singing 

输出:新表:

Name Gender Hobbies Time


name    F   singing 10:15
4

1 回答 1

0

如果我理解你的问题:

创建了三个parti数据集

 parti1 <- as.data.frame(matrix(5:25, ncol=3, dimnames=list(NULL, c("Col1", "Col2", "Time"))))
 parti2 <- as.data.frame(matrix(1:15, ncol=3, dimnames=list(NULL, c("Col1", "Col2", "Time"))))
 parti3 <- as.data.frame(matrix(1:15, ncol=3, dimnames=list(NULL, c("Col1", "Col2", "Time"))))

用于获取数据集的lsmget

例如,

ls(pattern="^parti") #gives you the created object names that starts with `parti` in the working environment.
#[1] "parti1" "parti2" "parti3"


lst1 <- mget(ls(pattern="^parti")) #mget will return a list of values of each `parti` object

如果您需要将Time每个数据集的列更改为 1,有几种方法。下面的方法在列表环境中创建了列。要更改原始数据集,您必须执行assignlist2env

Map(function(x, y) {x[,"Time"] <- y; x}, lst1, 1)

或者

 lapply(lst1, function(x) {x$Time <-1; x}) #I am changing the existing `Time` column to 1 by using the assignment operator `<-`.

如果要创建新列,只需执行以下操作:

 lapply(lst1, function(x) {x$Time1 <-1; x})

更新

如果您需要更改/创建原始数据集中的列,

  partin <- paste0("parti", 1)
  assign(partin, `[[<-`(get(partin),'Time', value=1)) 

上述方法以stringiepartin作为第一个参数,并使用替换函数[[<-。然后得到partinuse的值get。下一个参数是要修改或创建的列,即。Time并为该列分配一个值1

  parti1
  #  Col1 Col2 Time
  #1    5   12    1
  #2    6   13    1
  #3    7   14    1
  #4    8   15    1
  #5    9   16    1
  #6   10   17    1
  #7   11   18    1

对于多个数据集,要更改/创建现有列/新列,您可以使用for循环assign或使用list2env

  partin1 <- paste0("parti", 1:3)
  for(i in seq_along(partin1)){
  assign(partin1[i], `[[<-`(get(partin1[i]), 'Time1', value=5)) #creating a new column
   }

  parti2
  #  Col1 Col2 Time Time1
  #1    1    6   11     5
  #2    2    7   12     5
  #3    3    8   13     5
  #4    4    9   14     5
  #5    5   10   15     5

这也可以使用list2env

  list2env(lapply(mget(partin1), 
         function(x) {x$Time2 <- 10 ;x}), envir=.GlobalEnv)

但是,我建议在列表中进行分析,而不是创建对象。

更新2

使用方法eval(parse

 partin <- paste0("parti", 1)
 toAssign <- paste0(partin, "[,'Time3']")
 str1 <- paste0(toAssign, "<-", 15)
 eval(parse(text=str1))
 parti1
 #  Col1 Col2 Time Time3
 #1    5   12   19    15
 #2    6   13   20    15
 #3    7   14   21    15
 #4    8   15   22    15
 #5    9   16   23    15
 #6   10   17   24    15
 #7   11   18   25    15

使用提供的示例数据集

 toAssign <- paste0("Oldtbl", "[, 'Time']")
 str1 <- paste0(toAssign, "<-", "'10:15'")
 eval(parse(text=str1))

 Oldtbl
 # Name Gender Hobbies  Time
 #1 name  FALSE singing 10:15

数据

Oldtbl <- structure(list(Name = "name", Gender = FALSE, Hobbies = "singing", 
Time = "10:15"), row.names = c(NA, -1L), .Names = c("Name", 
"Gender", "Hobbies", "Time"), class = "data.frame")
于 2014-10-04T07:01:21.707 回答