我在數據框中有多個遵循相同命名約定的列。可以說我有:與命名模式相匹配的R-乘法列
a_1 a_2 b_1 b_2
1 0 0 0 0
2 0 0 0 0
我想在B_1值,和值A_2由B_2的值乘以A_1值,假設A_3 * B_3,.....,等等上。
有什麼方法可以實現這一點,並將信息插入到新列中?
我在數據框中有多個遵循相同命名約定的列。可以說我有:與命名模式相匹配的R-乘法列
a_1 a_2 b_1 b_2
1 0 0 0 0
2 0 0 0 0
我想在B_1值,和值A_2由B_2的值乘以A_1值,假設A_3 * B_3,.....,等等上。
有什麼方法可以實現這一點,並將信息插入到新列中?
通過的「josliber」註釋的啓發,謝謝爲這裏的投入。這是我的解決方案。
1)確定圖案,str_extract_all使用來自stringr
包解壓模式(採用正環視)中提取「A_」和「b _」。該解決方案將工作,即使格局的變化,以類似「ABC_」和「XYZ_」,只要它遵循原始模式。 但是,如果模式列不相等或模式完全不同,則解決方案將不起作用。
2)確定「mult」以檢查每個模式的列數。
3)使用「*」乘以列。
4)Cbind列以獲得最終結果。
train <- data.frame(a_1 = 1:5,a_2 = 2:6,b_1 = 11:15, b_2 = 12:16,a_3 = 21:25, b_3 = 22:26)
library(stringr)
vect <- str_extract_all(names(train),"(\\w*_)(?=\\d*)",simplify=T)[,1]
vect <- unique(vect)
###determine the number of of columns against eatch match , for ex. "a_" would have 3 and so on.
mult <- ncol(train)/length(vect)
dat2 <- train[,paste0(vect[1], 1:mult)] * train[,paste0(vect[2], 1:mult)]
names(dat2) <- paste0(vect[1],vect[2],1:mult)
datfinal <- data.frame(cbind(train,dat2))
答案:
> datfinal
a_1 a_2 b_1 b_2 a_3 b_3 a_b_1 a_b_2 a_b_3
1 1 2 11 12 21 22 11 24 462
2 2 3 12 13 22 23 24 39 506
3 3 4 13 14 23 24 39 56 552
4 4 5 14 15 24 25 56 75 600
5 5 6 15 16 25 26 75 96 650
與命名約定隨機數據幀:
df<-data.frame(matrix(runif(24),ncol=4))
colnames(df)<-c("lolz_1","lolz_2", "lel_1", "lel_2")
這類似於什麼建議的意見:
df$new_col<-df[, grepl("lolz", names(df))]*df[, grepl("lel", names(df))]
'M [,paste0( 「A_」,1:N)] * M [,paste0( 「B_」,1:N)]',其中'n'是每列的數量,應計算所有產品。你可以用'cbind'作爲你的矩陣的新列。 – josliber