30

このような2つのベクトルがあります

 x <-c(1,2,3)
 y <-c(100,200,300)
 x_name <- "cond"
 y_name <- "rating"

次のようなデータフレームを出力したいと思います。

> print(df)
      cond rating
      1  x 1 
      2  x 2
      3  x 3
      4  y 100
      5  y 200
      6  y 300

それを行う方法は何ですか?

4

7 に答える 7

68

これは尋ねられた質問に答えるものではありませんが、多くの人が持っている関連する質問に答えます:

x <-c(1,2,3)
y <-c(100,200,300)
x_name <- "cond"
y_name <- "rating"

df <- data.frame(x,y)
names(df) <- c(x_name,y_name)
print(df)

  cond rating
1    1    100
2    2    200
3    3    300
于 2013-01-31T11:29:01.273 に答える
16
x <-c(1,2,3)
y <-c(100,200,300)
x_name <- "cond"
y_name <- "rating"

require(reshape2)
df <- melt(data.frame(x,y))
colnames(df) <- c(x_name, y_name)
print(df)

更新 (2017-02-07): @cdaringe コメントへの回答として - 複数の解決策が考えられますが、そのうちの 1 つを以下に示します。

library(dplyr)
library(magrittr)

x <- c(1, 2, 3)
y <- c(100, 200, 300)
z <- c(1, 2, 3, 4, 5)
x_name <- "cond"
y_name <- "rating"

# Helper function to create data.frame for the chunk of the data
prepare <- function(name, value, xname = x_name, yname = y_name) {
  data_frame(rep(name, length(value)), value) %>%
    set_colnames(c(xname, yname))
}

bind_rows(
  prepare("x", x),
  prepare("y", y),
  prepare("z", z)
)
于 2013-01-31T08:02:39.230 に答える
11

ベースRのみを使用して、要求したデータフレームを生成するために、これはうまくいくはずです:

df <- data.frame(cond=c(rep("x", times=length(x)), 
                        rep("y", times=length(y))), 
                 rating=c(x, y))

df
  cond rating
1    x      1
2    x      2
3    x      3
4    y    100
5    y    200
6    y    300

ただし、最初の説明から、これはおそらくより可能性の高いユースケースであると言えます。

df2 <- data.frame(x, y)
colnames(df2) <- c(x_name, y_name)

df2
  cond rating
1    1    100
2    2    200
3    3    300

[編集: 例 1 の括弧を移動]

于 2013-01-31T08:08:11.377 に答える
9

expand.grid( ) 関数を使用できます。

x <-c(1,2,3)
y <-c(100,200,300)
expand.grid(cond=x,rating=y)
于 2015-03-13T18:49:02.743 に答える
3

ここに簡単な関数があります。データ フレームを生成し、ベクトルの名前を最初の列の値として自動的に使用します。

myfunc <- function(a, b, names = NULL) {
  setNames(data.frame(c(rep(deparse(substitute(a)), length(a)), 
                        rep(deparse(substitute(b)), length(b))), c(a, b)), names)
}

例:

x <-c(1,2,3)
y <-c(100,200,300)
x_name <- "cond"
y_name <- "rating"

myfunc(x, y, c(x_name, y_name))

  cond rating
1    x      1
2    x      2
3    x      3
4    y    100
5    y    200
6    y    300
于 2013-01-31T08:28:05.300 に答える
1

df = data.frame(cond=c(rep("x",3),rep("y",3)),rating=c(x,y))

于 2013-01-31T08:07:15.747 に答える
1

上記のhttps://stackoverflow.com/users/1969435/gx1sptdtdaの代替簡略化:

cond <-c(1,2,3)
rating <-c(100,200,300)
df <- data.frame(cond, rating)
df
  cond rating
1    1    100
2    2    200
3    3    300
于 2016-09-09T14:46:37.803 に答える