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

あなたの質問を理解できたら:

parti3 つのデータセットを作成しました

 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"))))

データセットの値を取得するために使用lsされますmget

例えば、

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 に変更する必要がある場合は、いくつかの方法があります。以下のメソッドは、リスト環境内に列を作成しました。元のデータセットを変更するには、assign またはする必要がありますlist2env

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ループを使用できますassignlist2env

  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)

ただし、オブジェクトを作成するのではなく、リストで分析を行うことをお勧めします。

Update2

を使用した方法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 に答える