2017-07-31 44 views
0

我有一個80列的表,我想通過乘以var1 * var41 var1 * var42 .... var1 * var80創建列。 var2 * var41 var2 * var42 ... var2 * var80。我怎麼能寫一個循環來乘以列並將標記的產品寫入.csv?結果應該有1600個額外的列。如何在R中使用循環創建新的帶標籤的變量並將它們寫入.csv?

+4

R時的特別這樣的東西,它可以這樣做沒有循環。但是你需要在R中得到一個'apply'函數的基本掛起。這裏有一個線索如何解決這個問題:'apply(x,2,function(a)(a * x [,1]))'' 。您還需要提出一個命名這些列的方案。接下來的步驟是使用'cbind'將所有內容都變成一個單獨的數據框 –

回答

1

我參加了一個刺在這個有一些假的數據:

# 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") 
相關問題