[英]Create a new column in R dataframe based on an existing column and a set of parameters
[英]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.