2016-02-13 3 views
0

У меня есть следующие векторы и объединенный фрейм данных, которые являются объектами, подающими на выражение ниже.using expand.grid с объектами

x <- c(1,2,3,4) 
y <- c(5,6,7,8) 
z <- c(9,10,11,12) 

h <- data.frame(x,y,z) 

D <- print ((rep (paste ("h[,3]") , nrow(h))) , quote=FALSE) 
# [1] h[,3] h[,3] h[,3] h[,3] 

DD <- c (print (paste ((D) , collapse=","))) 
# "[1] h[,3],h[,3],h[,3],h[,3]" 

DDD <- print (DD, quote = FALSE) 

# However when I place DDD in expand.grid it does not work 

is(DDD) 
[1] "character" "vector" "data.frameRowLabels" "SuperClassMethod" 

Таким образом, экспрессия expand.grid (DDD) не работает. Как я могу получить процесс, в котором я повторяю n раз элемент символа, который представляет объект, чтобы получить вектор числа повторяющихся элементов символа, который при размещении в expand.grid работает.

ответ

3

Похоже, вы пытаетесь сгенерировать некоторый R-код, а затем выполните его. В вашем случае, это будет работать:

# From your question 
DDD 
# [1] "h[,3],h[,3],h[,3],h[,3]" 

# The code that you wish to execute, as a string 
my_code <- paste("expand.grid(", DDD, ")") 
# [1] "expand.grid(h[,3],h[,3],h[,3],h[,3])" 

# Execute the code 
eval(parse(text = my_code)) 

Я действительно рекомендую против делать это. См. here по ряду причин, почему eval(parse(text = ...)) - плохая идея.

Более решение «R», чтобы выполнить свою задачу:

# Generate the data.frame, h 
x <- c(1,2,3,4) 
y <- c(5,6,7,8) 
z <- c(9,10,11,12) 
h <- data.frame(x,y,z) 

# Repeat the 3rd column 3 times, then call expand.grid 
expand.grid(rep(list(h[,3]), times = 3)) 

# Alternatively, access the column by name 
expand.grid(rep(list(h$z), times = 3)) 

Кстати, я рекомендую смотреть на файлы справки для expand.grid - они помогли мне найти решение вашей проблемы довольно быстро после понимания аргументы для expand.grid.

+0

Точка на более эффективном коде выше, большое спасибо – Barnaby

+1

'replicate' немного более прямое, чем' list' + 'rep'. 'expand.grid (replicate (3, h [, 3], FALSE))'. – A5C1D2H2I1M1N2O1R2T1

Смежные вопросы