Я пытаюсь выполнить базовое заполнение формул в стиле Excel в R. Я хочу заполнить значение «ячейка» на основе значений других ячеек в той же матрице или data.frame. Функция довольно проста для работы с одной ячейкой, но ее сложнее масштабировать как по строкам, так и по столбцам.
Скажите, у меня есть простая матрица:
simple <- matrix(c(0,1,2,3,0,4,5,6,7,NA,NA,NA,8,NA,NA,NA), nrow = 4, ncol = 4)
[,1] [,2] [,3] [,4]
[1,] 0 0 7 8
[2,] 1 4 NA NA
[3,] 2 5 NA NA
[4,] 3 6 NA NA
Я хочу заполнить NA с суммой столбцов 1 и 2 в той же строке и строки 1 в том же столбце. В Excel для ячейки C2 это будет
=$A2 + $B2 + C$1
в R
simple[2,3] <- simple[2,1] + simple[2,2] + simple[1,3]
В Excel вы можете просто перетащить формулу на оставшиеся ячейки и вуаля. В R не все так просто.
Так как r векторизована, я могу довольно легко заполнить весь столбец, задав диапазоны вместо отдельных ячеек, например:
simple[2:4,3] <- simple[2:4,1] + simple[2:4,2] + simple[1,3]
[,1] [,2] [,3] [,4]
[1,] 0 0 7 8
[2,] 1 4 12 NA
[3,] 2 5 14 NA
[4,] 3 6 16 NA
Но когда я пытаюсь векторизовать как строки, так и столбцы, это не сработает, потому что оно интерпретирует последнее значение как вектор с (7,8) и пытается добавить это в виде строк, а не добавив его по столбцам.
simple[2:4,3:4] <- simple[2:4,1] + simple[2:4,2] + simple[1,3:4]
Warning message:
In simple[2:4, 1] + simple[2:4, 2] + simple[1, 3:4] :
longer object length is not a multiple of shorter object length
[,1] [,2] [,3] [,4]
[1,] 0 0 7 8
[2,] 1 4 12 12
[3,] 2 5 15 15
[4,] 3 6 16 16
В качестве альтернативного решения можно сделать вложенные для циклов, как показано ниже:
for (i in 2:4){
for (j in 3:4){
simple[i,j] <- simple[i,1] + simple[i,2] + simple[1,j]
}
}
[,1] [,2] [,3] [,4]
[1,] 0 0 7 8
[2,] 1 4 12 13
[3,] 2 5 14 15
[4,] 3 6 16 17
Это на самом деле работает и довольно просто, но включает в себя вложенные циклы, так что достаточно сказано.
Мне кажется, что "правильным" решением было бы решение, использующее правильную векторизацию, apply () или dplyr, но я не могу понять, как заставить их работать, за исключением перестановки данных из формата кросс-таблицы в плоский формат, но это может очень быстро увеличить размер файла.
Есть какие-нибудь идеи о том, как сделать это более модным?