0
我有一個80列的表,我想通過乘以var1 * var41 var1 * var42 .... var1 * var80創建列。 var2 * var41 var2 * var42 ... var2 * var80。我怎麼能寫一個循環來乘以列並將標記的產品寫入.csv?結果應該有1600個額外的列。如何在R中使用循環創建新的帶標籤的變量並將它們寫入.csv?
我有一個80列的表,我想通過乘以var1 * var41 var1 * var42 .... var1 * var80創建列。 var2 * var41 var2 * var42 ... var2 * var80。我怎麼能寫一個循環來乘以列並將標記的產品寫入.csv?結果應該有1600個額外的列。如何在R中使用循環創建新的帶標籤的變量並將它們寫入.csv?
我參加了一個刺在這個有一些假的數據:
# Fake data (arbitraty 5 rows)
mtx <- sample(1:100, 5 * 80, replace = T)
dim(mtx) <- c(5,80)
colnames(mtx) <- paste0("V", 1:ncol(mtx)) # Name the original columns
mtx[1:5,1:5]
# V1 V2 V3 V4 V5
#[1,] 8 10 69 84 92
#[2,] 59 34 36 96 86
#[3,] 51 26 78 63 8
#[4,] 74 93 73 70 49
#[5,] 62 30 20 43 9
使用for循環,一個可以嘗試這樣的事:
v <- expand.grid(1:40,41:80) # all combos
v[c(1:3,1598:1600),]
# Var1 Var2
#1 1 41
#2 2 41
#3 3 41
#1598 38 80
#1599 39 80
#1600 40 80
# Initialize matrix for multiplication results
newcols <- matrix(NA, nrow = nrow(mtx), ncol = nrow(v))
# Run the for loop
for(i in 1:nrow(v)) newcols[,i] <- mtx[,v[i,1]] * mtx[,v[i,2]]
# save the names as "V1xV41" format with apply over rows (Margin = 1)
# meaning, for each row in v, paste "V" in front and "x" between
colnames(newcols) <- apply(v, MARGIN = 1, function(eachv) paste0("V", eachv, collapse="x"))
# combine the additional 1600 columns
tocsv <- cbind(mtx, newcols)
tocsv[,78:83] # just to view old and new columns
# V78 V79 V80 V1xV41 V2xV41 V3xV41
#[1,] 17 92 13 429 741 1079
#[2,] 70 94 1 4836 4464 5115
#[3,] 6 77 93 3740 1020 3468
#[4,] 88 34 26 486 258 66
#[5,] 48 77 61 873 4365 970
# Write it
write.csv(tocsv, "C:/Users/Evan Friedland/Documents/NEWFILENAME.csv")
R時的特別這樣的東西,它可以這樣做沒有循環。但是你需要在R中得到一個'apply'函數的基本掛起。這裏有一個線索如何解決這個問題:'apply(x,2,function(a)(a * x [,1]))'' 。您還需要提出一個命名這些列的方案。接下來的步驟是使用'cbind'將所有內容都變成一個單獨的數據框 –