У меня такой df:
a <- c(4,5,3,5,1)
b <- c(8,9,7,3,5)
c <- c(6,7,5,4,3)
df <- data.frame(rbind(a,b,c))
Мне нужен новый df, df2, содержащий разницу между значениями в каждой ячейке в строках a и b и значением в строке c в соответствующих столбцах.
df2 будет выглядеть так:
a <- c(-2,-2,-2,1,-2)
b <- c(2,2,2,-1,2)
df2 <- data.frame(rbind(a,b))
Вот где я застреваю:
df2 <- data.frame(apply(df,c(1,2),function(x) x - df[nrow(df),the col index of x]))
Как мне сослаться на индекс столбца x? Есть ли что-то вроде this
в JavaScript?
На самом деле, зачем вообще транспонировать? Что не так с df - df["c", , drop = TRUE]
, а затем удалением строки "c"
?
Мы можем сделать это легко, реплицируя 3-ю строку, чтобы сделать длины равными, прежде чем вычитать из первых двух строк.
out <- df[c("a", "b"),] - df["c",][col(df[c("a", "b"),])]
identical(df2, out)
#[1] TRUE
Или явно используя rep
df[c("a", "b"),] - rep(unlist(df["c",]), each = 2)
Приведенные мной образцы данных намного меньше фактического df, с которым я работаю. В моем реальном df 30 строк, и я бы не хотел вводить имя каждой строки в c()
.
@ orangeman51 Строки вводить не нужно. Просто вы специально упомянули имена, я это использовал. Предположим, вы ищете от 5 до 20 строк, это должно быть df[5:20,] - df[21,][col(df[5:20,])]
.
Помогло бы упомянуть вашу точку зрения в исходном вопросе, @ orangeman51
Возможно, я запутался, но почему бы просто не транспонировать, а затем использовать стандартный синтаксис фрейма данных?