Вычтите ряд цен в одном кадре данных из столбцов в другом

У меня есть фрейм данных с 163 столбцами с уникальными именами, скажем (x1, x2, x3, x4 ....), каждый из этих столбцов имеет ряд возвращений (0.248, -0.00384 и т. Д.).

**DF1**
 x1       x2      x3     x4    .....
0.248 -0.00384  0.0394 0.0053  .....

В другом кадре данных у меня есть один столбец со списком одинаковых уникальных имен (x1, x2, x3, x4 ...) и другой со списком чисел (0.005, .001 и т. Д.).

**DF2**
x1 0.005
x2 0.001 
x3 0.005
x4 0.0005
...

Моя конечная цель - вернуть фрейм данных с 163 столбцами (x1, x2 и т. Д.) С чистыми доходами каждого столбца (таким образом, столбец x1 - это исходный результат, вычтенный из 0,005, столбец x2 - исходный результат, вычтенный из 0,001 и т. Д.).

До сих пор я пытался отсортировать второй кадр данных, транспонировать и использовать unlist, чтобы получить вектор чисел, который я затем мог бы вычесть из каждого столбца (но я не могу понять, как вычесть из каждого столбца). Любая помощь в выяснении, как это сделать, была бы действительно полезной. Список уникальных имен во втором фрейме данных совпадает с первым фреймом данных, который также отсортирован в алфавитном порядке, поэтому его не нужно сопоставлять (оба отсортированных будут выстроены в линию).

1 ответ

Решение

В случае, если имена DF1 и имена строк DF2 не в том же порядке, вы можете использовать match

 DF1-DF2[match(colnames(DF1), rownames(DF2)),1][col(DF1)]

Должно работать, если один или оба набора данных не в том же порядке. Например

 set.seed(65)
 DF1N <- DF1[,sample(colnames(DF1))]

 DF1N-DF2[match(colnames(DF1N), rownames(DF2)),1][col(DF1N)]

Если они в порядке

 DF1-DF2[,1][col(DF1)]

данные

set.seed(24)
DF1 <- as.data.frame(matrix(rnorm(40*10), ncol=10,
             dimnames=list(NULL, paste0("x", 1:10))) )
set.seed(42)
DF2 <- data.frame(Col1=rnorm(10, 0.01))
row.names(DF2) <- sample(paste0("x",1:10))
Другие вопросы по тегам