Я добавил еще одну строку, чтобы сделать решение более общим.
В базе R мы можем разделить фрейм данных на столбец Total
в этой строке, а затем rbind
с исходным фреймом данных.
new_df <- rbind(df, df/df[, "Total"])
new_df
# X Y Z A B C Total
#1 2.0000000 3.0000000 4.0000000 7.0000000 2.0000000 1.00000000 19
#2 1.0000000 2.0000000 5.0000000 6.0000000 7.0000000 4.00000000 25
#11 0.1052632 0.1578947 0.2105263 0.3684211 0.1052632 0.05263158 1
#21 0.0400000 0.0800000 0.2000000 0.2400000 0.2800000 0.16000000 1
Если порядок важен и выесли вы хотите сохранить его, тогда мы можем просто изменить его порядок
rbind(new_df[c(T, F),], new_df[c(F, T),])
# X Y Z A B C Total
#1 2.0000000 3.0000000 4.0000000 7.0000000 2.0000000 1.00000000 19
#11 0.1052632 0.1578947 0.2105263 0.3684211 0.1052632 0.05263158 1
#2 1.0000000 2.0000000 5.0000000 6.0000000 7.0000000 4.00000000 25
#21 0.0400000 0.0800000 0.2000000 0.2400000 0.2800000 0.16000000 1
РЕДАКТИРОВАТЬ
Если есть определенные столбцы, которые являются строками, мы можем их игнорировать и использоватьbind_rows
вместо rbind
, поскольку он напрямую возвращает NA
для несоответствующих столбцов.
library(dplyr)
bind_rows(df1, df1[!names(df1) %in% "D"]/df1[, "Total"])
# X Y Z A B C Total D
#1 2.0000000 3.0000000 4.0000000 7.0000000 2.0000000 1.00000000 19 abc
#2 1.0000000 2.0000000 5.0000000 6.0000000 7.0000000 4.00000000 25 def
#3 0.1052632 0.1578947 0.2105263 0.3684211 0.1052632 0.05263158 1 <NA>
#4 0.0400000 0.0800000 0.2000000 0.2400000 0.2800000 0.16000000 1 <NA>
данные
df <- structure(list(X = c(2, 1), Y = c(3, 2), Z = c(4, 5), A = c(7,
6), B = c(2, 7), C = c(1, 4), Total = c(19, 25)), .Names = c("X",
"Y", "Z", "A", "B", "C", "Total"), row.names = c("1", "2"), class = "data.frame")
df1 <-structure(list(X = c(2, 1), Y = c(3, 2), Z = c(4, 5), A = c(7,
6), B = c(2, 7), C = c(1, 4), Total = c(19, 25), D = c("abc",
"def")), .Names = c("X", "Y", "Z", "A", "B", "C", "Total", "D"
), row.names = c("1", "2"), class = "data.frame")