2017-03-18 69 views
2

我遇到了問題。 讓我舉個例子。在r中插入基於ID的行

x <- data.frame(id = letters[1:3], val0 = 1:3, val1 = 4:6, val2 = 7:9) 
# id val0 val1 val2 
# 1 a 1 4 7 
# 2 b 2 5 8 
# 3 c 3 6 9 
cbind(id = x[, 1], x[, -1]/rowSums(x[, -1])) 
## id  val0  val1  val2 
## 1 a 0.08333333 0.3333333 0.5833333 
## 2 b 0.13333333 0.3333333 0.5333333 
## 3 c 0.16666667 0.3333333 0.5000000 

我期望的輸出就像下面

# id val0  val1  val2 
# 1 a 1   4   7 
# 1 a 0.08333333 0.3333333 0.5833333 
# 2 b 2   5   8 
# 2 b 0.13333333 0.3333333 0.5333333 
# 3 c 3   6   9 
# 3 c 0.16666667 0.3333333 0.5000000 

我該怎麼辦呢?

回答

1

我們可以rbind數據集,然後做一個order

library(data.table) 
rbindlist(list(x, cbind(id = x[, 1], x[, -1]/rowSums(x[, -1]))))[order(id)] 
# id  val0  val1  val2 
#1: a 1.00000000 4.0000000 7.0000000 
#2: a 0.08333333 0.3333333 0.5833333 
#3: b 2.00000000 5.0000000 8.0000000 
#4: b 0.13333333 0.3333333 0.5333333 
#5: c 3.00000000 6.0000000 9.0000000 
#6: c 0.16666667 0.3333333 0.5000000 
+0

偉大的!謝謝~~這真的很有幫助! –