我又添加了一行以使解决方案更通用。
在基础 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")