2013-01-31 25 views

Odpowiedz

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

UPDATE (7.02.2017): Jako odpowiedź na @cdaringe komentarz - istnieje wiele rozwiązań możliwe, jednym z nich jest niższa.

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) 
) 
+0

wiesz jak by to zmienić, jeśli nie było również elementem takiego jak 'z <-c (1,2,3,4,5) '? wymiarowość jest inna, dlatego też ramka danych w tym rozwiązaniu nie bierze się za tworzenie. – cdaringe

1

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

6

To powinno załatwić sprawę, aby wytworzyć ramkę danych prosiłeś, używając tylko zasady 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 

Jednak ze swojego początkowego opisu, powiedziałbym, że jest to prawdopodobnie bardziej prawdopodobne użycie:

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

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

[edytuj: przeniesione nawiasy w przykładzie 1]

+0

Jeden błąd bracketingu - skorygowany kod: df <- data.frame (cond = c (rep ("x", czasy = długość (x)), rep ("y", czasy = długość (y))), ocena = c (x, y)) – maia

+0

Dokładnie to, czego potrzebowałem! Podrapałam się w głowę nad łączeniem wielu wektorów w dane.frame, które działało. Dzięki!!! – mightypile

3

Oto prosta funkcja. Generuje ramkę danych i automatycznie używa nazw wektorów jako wartości dla pierwszej kolumny.

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

Przykład:

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 
40

Choć to nie jest odpowiedź na pytanie zadane, to odpowiada powiązany wątpliwości, że wiele osób miało:

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 
+1

Twoje wyniki różnią się od oczekiwań pytania. Nie rozumiem tego. – TSR

+0

Myślę, że to odpowiada na pytanie, które mają inni ludzie. Właśnie zaktualizowałem odpowiedź, aby to odnotować. – fny

5

Można użyć expand.grid() Funkcja.

x <-c(1,2,3) 
y <-c(100,200,300) 
expand.grid(cond=x,rating=y) 
+0

To jest najprostsza, a zatem najlepsza metoda. Rozwiązuje problem z jednokreskowym wywołaniem do podstawowej funkcji R. – Argent