簡體   English   中英

如何基於現有R數據框中的所有單元格創建新行

[英]How to create a new row based on all cells in an existing R dataframe

我想基於現有R數據框中的所有其他單元格創建一個新行。 這是稱為“ dat1”的現有R數據幀。

dat1 <- structure(list(a = c(0.80, -0.72, 1.36, 1.57, -0.58), 
                       b = c(-1.39, 0.66, -0.01, 1.24, 1.19), 
                       c = c(0.35, 0.44, 0.32, 1.90, -0.11), 
                       d = c(-0.09, -1.26, 1.14, -0.37, 0.95), 
                       e = c(0.59, 0.05,-1.08, 1.44, 0.58), 
                       weight = c(3.2, 4.3, 5.6, 3.4, 5.2)), 
                   row.names = c(NA, -5L), class = "data.frame")

“數據”包含五行五列。 我要創建第六行。

data[6,1] = data[1,1]*data[1,6]+data[2,1]*data[2,6]+data[3,1]*data[3,6]+data[4,1]*data[4,6]+data[5,1]*data[5,6]
data[6,2] = data[1,2]*data[1,6]+data[2,2]*data[2,6]+data[3,2]*data[3,6]+data[4,2]*data[4,6]+data[5,2]*data[5,6]
data[6,3] = data[1,3]*data[1,6]+data[2,3]*data[2,6]+data[3,3]*data[3,6]+data[4,3]*data[4,6]+data[5,3]*data[5,6]
data[6,4] = data[1,4]*data[1,6]+data[2,4]*data[2,6]+data[3,4]*data[3,6]+data[4,4]*data[4,6]+data[5,4]*data[5,6]
data[6,5] = data[1,5]*data[1,6]+data[2,5]*data[2,6]+data[3,5]*data[3,6]+data[4,5]*data[4,6]+data[5,5]*data[5,6]code here
data[6,6] = NA

這是我嘗試過的:

方法1

data[6,1] <- data[1,1]*data[1,6]+data[2,1]*data[2,6]+data[3,1]*data[3,6]+data[4,1]*data[4,6]+data[5,1]*data[5,6]
data[6,2] <- data[1,2]*data[1,6]+data[2,2]*data[2,6]+data[3,2]*data[3,6]+data[4,2]*data[4,6]+data[5,2]*data[5,6]
data[6,3] <- data[1,3]*data[1,6]+data[2,3]*data[2,6]+data[3,3]*data[3,6]+data[4,3]*data[4,6]+data[5,3]*data[5,6]
data[6,4] <- data[1,4]*data[1,6]+data[2,4]*data[2,6]+data[3,4]*data[3,6]+data[4,4]*data[4,6]+data[5,4]*data[5,6]
data[6,5] <- data[1,5]*data[1,6]+data[2,5]*data[2,6]+data[3,5]*data[3,6]+data[4,5]*data[4,6]+data[5,5]*data[5,6]
data[6,6] <- NA

我也嘗試了方法2:

data1 <- data[1:5,1:5]

然后創建一個名為data2的新數據框:

for (i in 1:5) {
  for (j in 1:5) {
    data2[i, j] <- data1[i, j] * data[j, 6]
  }
}

然后創建一個新行

newrow <- colSums(data2)

然后是最終數據3

data3 <- rbind(data1,newrow)

我發現結果與方法1和2不同。因為我的真實數據集比“數據”大得多。 我希望有人能以一種簡便的方法來幫助我計算新行。

提前致謝。

之所以得到不同的結果,是因為您混合了for循環中的索引。 您要計算每列的加權總和。 因此,您應該在列上循環,然后將每列乘以相應的權重。 for循環中,您指定的權重錯誤。 您乘以列j與行的權重始終j 這是解決問題的方法(完全可復制):

首先, 方法1的結果:

method1 <- dat1

method1[6,1] <- method1[1,1]*method1[1,6]+method1[2,1]*method1[2,6]+method1[3,1]*method1[3,6]+method1[4,1]*method1[4,6]+method1[5,1]*method1[5,6]
method1[6,2] <- method1[1,2]*method1[1,6]+method1[2,2]*method1[2,6]+method1[3,2]*method1[3,6]+method1[4,2]*method1[4,6]+method1[5,2]*method1[5,6]
method1[6,3] <- method1[1,3]*method1[1,6]+method1[2,3]*method1[2,6]+method1[3,3]*method1[3,6]+method1[4,3]*method1[4,6]+method1[5,3]*method1[5,6]
method1[6,4] <- method1[1,4]*method1[1,6]+method1[2,4]*method1[2,6]+method1[3,4]*method1[3,6]+method1[4,4]*method1[4,6]+method1[5,4]*method1[5,6]
method1[6,5] <- method1[1,5]*method1[1,6]+method1[2,5]*method1[2,6]+method1[3,5]*method1[3,6]+method1[4,5]*method1[4,6]+method1[5,5]*method1[5,6]
method1[6,6] <- NA

method1
#        a      b      c     d      e weight
# 1  0.800 -1.390  0.350 -0.09  0.590    3.2
# 2 -0.720  0.660  0.440 -1.26  0.050    4.3
# 3  1.360 -0.010  0.320  1.14 -1.080    5.6
# 4  1.570  1.240  1.900 -0.37  1.440    3.4
# 5 -0.580  1.190 -0.110  0.95  0.580    5.2
# 6  9.402  8.738 10.692  4.36  3.967     NA

這是修改后的方法2

data1 <- dat1[1:5, 1:5]
data2 <- data.frame(matrix(numeric(5*5), ncol = 5))
names(data2) <- letters[1:5]

for (i in 1:5) {
  for (j in 1:5) {
    data2[j, i] <- data1[j, i] * dat1[j, 6]
  }
}

method2 <- rbind(data1, colSums(data2))

method2 
#        a      b      c     d      e
# 1  0.800 -1.390  0.350 -0.09  0.590
# 2 -0.720  0.660  0.440 -1.26  0.050
# 3  1.360 -0.010  0.320  1.14 -1.080
# 4  1.570  1.240  1.900 -0.37  1.440
# 5 -0.580  1.190 -0.110  0.95  0.580
# 6  9.402  8.738 10.692  4.36  3.967

好的,所以現在結果同意了。 我提出了另一種方法3

dat1[6, ] <- c(apply(dat1[, 1:5], MARGIN = 2, function(x) sum(x * dat1[, 6])), NA)

dat1
#        a      b      c     d      e weight
# 1  0.800 -1.390  0.350 -0.09  0.590    3.2
# 2 -0.720  0.660  0.440 -1.26  0.050    4.3
# 3  1.360 -0.010  0.320  1.14 -1.080    5.6
# 4  1.570  1.240  1.900 -0.37  1.440    3.4
# 5 -0.580  1.190 -0.110  0.95  0.580    5.2
# 6  9.402  8.738 10.692  4.36  3.967     NA

這是如何運作的? apply將指定的函數應用於數據dat1[, 1:5]所有列( MARGIN = 2 )。 該函數計算特定列( x )與dat1[, 6]存儲的權重的dat1[, 6]並對這些數字求和。 最后,我們需要添加NA因為dat1有六列,並且apply僅返回五個值的向量。

數據

dat1 <- structure(list(a = c(0.80, -0.72, 1.36, 1.57, -0.58), 
                       b = c(-1.39, 0.66, -0.01, 1.24, 1.19), 
                       c = c(0.35, 0.44, 0.32, 1.90, -0.11), 
                       d = c(-0.09, -1.26, 1.14, -0.37, 0.95), 
                       e = c(0.59, 0.05,-1.08, 1.44, 0.58), 
                       weight = c(3.2, 4.3, 5.6, 3.4, 5.2)), 
                  row.names = c(NA, -5L), class = "data.frame")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM