Как объединить два вектора в кадр данных
У меня есть два вектора типа
x <-c(1,2,3)
y <-c(100,200,300)
x_name <- "cond"
y_name <- "rating"
Я хотел бы вывести dataframe следующим образом:
> print(df)
cond rating
1 x 1
2 x 2
3 x 3
4 y 100
5 y 200
6 y 300
Каким образом это сделать?
Ответы
Ответ 1
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 - возможны несколько решений, один из которых ниже.
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)
)
Ответ 2
Хотя это не отвечает на заданный вопрос, он отвечает на связанный с ним вопрос, который был у многих людей:
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
Ответ 3
Это должно сделать трюк для создания кадра данных, который вы просили, используя только базу 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]
Ответ 4
Вы можете использовать функцию expand.grid().
x <-c(1,2,3)
y <-c(100,200,300)
expand.grid(cond=x,rating=y)
Ответ 5
Здесь простая функция. Он генерирует кадр данных и автоматически использует имена векторов как значения для первого столбца.
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
Ответ 6
df = data.frame(cond=c(rep("x",3),rep("y",3)),rating=c(x,y))
Ответ 7
Alt упрощение 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