1

したがって、data.frame コマンドを使用して、次のように複数のベクトルを 1 つのデータフレームに結合できることがわかっています。

my.data <- data.frame(name1, age1, name20, age20, name38, age38)

(変数名はあまり意味がありません。name1、name20、および name38 を 3 つの異なる列に配置する必要があるのはなぜですか?無視してください:実際の変数名は異なります。これは説明のみを目的としています)。

問題は、そのようなベクトルが約 40 個あり、コードの他の部分でも多くのベクトルを結合する必要があることです。そのため、毎回膨大な量のコードをコピーして貼り付けない方が便利です。だから私はこれの周りに for ループを書くことを考えました:

for (i in c("name", "age", "hgt"))
{
    for (k in c(1,20,38))
    {
    my.data$i,as.character(k) <- data.frame(get(paste(i,as.character(k),sep="")))
    }
}

しかし、これはうまくいきません。これは、このコードの一部に「paste()」を記述する必要があるためですか、それとも単にこの問題への取り組み方が悪いのでしょうか? i と k をループして、すべてのベクトルが列としてアタッチされた最終結果として「newdata」データフレームを取得する正しい方法は何ですか?

4

2 に答える 2

2

おそらく、次のようなことを達成しようとしていますか?

name1 <- letters[1:10]
age1 <- 1:10
name20 <- letters[11:20]
age20 <- 11:20
name38 <- LETTERS[1:10]
age38 <- 21:30

paste.pattern <- paste(rep(c("name", "age"), times = 3), 
                       rep(c(1, 20, 38), each = 2), sep = "")

newdata <- data.frame(sapply(paste.pattern, get))
于 2012-10-28T02:47:06.630 に答える
1

すべての個々のベクトルの語幹 (例: hgt) と数字 (例1) の配置が似ている場合、次のようにすることができます。

# test data
name1 <- letters[1:10]
age1 <- 1:10
name20 <- letters[11:20]
age20 <- 11:20
name38 <- LETTERS[1:10]
age38 <- 21:30

# group them up in a dataframe looking for "age" OR (|) "name" as the stem
data.frame(sapply(ls(pattern="^age[0-9]+$|^name[0-9]+$"),get))

# result:
   age1 age20 age38 name1 name20 name38
1     1    11    21     a      k      A
2     2    12    22     b      l      B
3     3    13    23     c      m      C
4     4    14    24     d      n      D
5     5    15    25     e      o      E
6     6    16    26     f      p      F
7     7    17    27     g      q      G
8     8    18    28     h      r      H
9     9    19    29     i      s      I
10   10    20    30     j      t      J

これにより、含まれるベクトルが語幹/数字の命名パターンに制限され、データフレームに予想外の追加が行われないようになります。

于 2012-10-28T02:56:13.993 に答える