2014-10-20 3 views
1

У меня есть вопрос относительно функции expand.grid(), используя два кадра данных, а не два вектора. Я хочу объединить два кадра данных и все их возможные комбинации вместе, просто вычитая все остальные переменные. Например ...R expand.grid() с кадрами данных

df1 <- data.frame('USC', '2.3', '1.3', '5.4') 
df2 <- data.frame('Texas', '1.2', '-1.4', '2.3') 

Поэтому в основном я могу получить все комбинации первой переменной с помощью функции expand.grid(), чтобы посмотреть, как «USC Техас, Texas USC» и т.д. ... но я хочу также вычесть или найти разницу между остальными переменными, связанными в фрейме данных. Например ...

('USC Texas', '1.1', '2.7', '3.1') 
('Texas USC', '-1.1', -2.7', '-3.1') 

Можно ли каким-либо образом объединить функцию expand.grid() с применением? Любая помощь будет оценена

+1

1,3 - (-1,4) = 2,7 – blakeoft

ответ

3

Вот подход:

mapply(function(x, y) if (!grepl("^[+-]?\\d+\\.\\d+$", x)) 
     c(paste(x, y), paste(y, x)) else 
      c(res <- as.numeric(as.character(x)) - as.numeric(as.character(y)), 
      -res), df1, df2) 

#  X.USC.  X.2.3. X.1.3. X.5.4. 
# [1,] "USC Texas" "1.1" "2.7" "3.1" 
# [2,] "Texas USC" "-1.1" "-2.7" "-3.1" 
1

Это еще один способ:

# clean up the data. Put df1 and df2 into one data.frame and convert the columns 
# to their natural data type. Name the columns. 
names(df2) <- names(df1) 
d <- rbind(df1, df2) 
names(d) <- letters[1:4] 
d[] <- lapply(d, function(col) type.convert(as.character(col))) 
#  a b c d 
#1 USC 2.3 1.3 5.4 
#2 Texas 1.2 -1.4 2.3 

# get the cartesian product of d with itself 
x <- merge(d, d, by=character(0)) 
x <- subset(x, a.x != a.y) 
x <- within(x, { 
    a <- paste(a.x, a.y) 
    b <- b.x - b.y 
    c <- c.x - c.y 
    d <- d.x - d.y 
}) 
x[c('a', 'b', 'c', 'd')] 
#   a b c d 
# 2 Texas USC -1.1 -2.7 -3.1 
# 3 USC Texas 1.1 2.7 3.1 
+0

Благодаря Matt & Sven Я пытался как и они работали , Я пытался заставить проблему с expand.grid() и не думал, чтобы смотреть за ее пределами. Я ценю помощь! – boothtp

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