Сопоставить строки и вычесть столбцы

У меня есть 2 набора данных с одинаковыми столбцами и разным количеством строк.

> dput(smalldf)
structure(list(X = structure(1:5, .Label = c("A", "B", "C", "F", 
"G"), class = "factor"), Y = c(1L, 2L, 3L, 6L, 7L), Z = c(10L, 
20L, 30L, 60L, 70L)), .Names = c("X", "Y", "Z"), class = "data.frame", row.names = c(NA, 
-5L))


> dput(bigdf)
structure(list(X = structure(1:7, .Label = c("A", "B", "C", "D", 
"E", "F", "G"), class = "factor"), Y = c(10L, 20L, 30L, 40L, 
50L, 60L, 70L), Z = c(100L, 200L, 300L, 400L, 500L, 600L, 700L
)), .Names = c("X", "Y", "Z"), class = "data.frame", row.names = c(NA, 
-7L))

Я хотел бы сопоставить похожие строки и вычесть столбец Y. Я знаю, что это довольно простая задача, но я не смог этого сделать! я должен использовать match()? или какая-то функция apply() здесь?


person Error404    schedule 06.08.2013    source источник
comment
Я думаю, что (E,X) должно быть 9, а не 3. bigdf[rownames(smalldf), ] <- bigdf[rownames(smalldf), ] - smalldf   -  person Arun    schedule 06.08.2013
comment
Извините, Аурн, похоже, что мое редактирование сильно изменило вопрос. Ваше здоровье   -  person Error404    schedule 06.08.2013
comment
Если вы попытаетесь понять, что делает эта команда, вы сможете с небольшими усилиями изменить ее в соответствии с вашими потребностями для вновь отредактированных данных. Мы ожидаем, что в SO люди учатся, отвечая на свои вопросы. Итак, я оставляю эту задачу на вас.   -  person Arun    schedule 06.08.2013


Ответы (1)


Это типо распространенная проблема. Один из способов сделать это в base R - использовать match, как вы предлагаете, вот так, без apply в поле зрения....

#  rows of bigdf that appear in smalldf, in order that they appear in smalldf 
idx <- match( rownames(smalldf) , rownames(bigdf) ) 

#  subtract rows of smalldf from bigdf for rows that appear in smalldf and rbind them with original rows from bigdf that do not appear in samlldf
result <- rbind( ( bigdf[ idx , ] - smalldf ) , bigdf[ -idx , ] )

#  Order the results
result <- result[ order( rownames(result) ) , ]
   X  Y  Z
A  3  2  5
B 10  3  7
C  0  0  6
D  5  3  4
E  9 -2 20
person Simon O'Hanlon    schedule 06.08.2013
comment
Спасибо за ответ, команда дает мне предупреждающее сообщение и делает некоторые странные вещи. Предупреждающее сообщение: Предупреждающее сообщение: В Ops.factor(слева, справа): - не имеет значения для факторов. Он также меняет имена строк, я загружу простой dput :), чтобы вы могли попробовать команду, я не могу понять, что пошло не так. Спасибо - person Error404; 06.08.2013
comment
@ Error404 Конечно, ваши данные не соответствуют тому, что вы описали в своем отредактированном вопросе !!! Это меня ОЧЕНЬ расстраивает. Столбец X больше не представляет собой целочисленные данные, но теперь он является фактором того, что раньше было именами строк. Изменить, например. rownames(bigdf) в bigdf$x и сделайте то же самое для smalldf. Возможно, вам также придется преобразовать bigdf$x и smalldf$x в символ из коэффициента. - person Simon O'Hanlon; 06.08.2013
comment
Приношу извинения за это @SimonO101, я знаю, что это довольно раздражает, но я пытался привести какой-нибудь правильный пример. Спасибо за Ваш ответ - person Error404; 06.08.2013