2017-04-03 55 views
0

我在数据框中有多个遵循相同命名约定的列。可以说我有:与命名模式相匹配的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,.....,等等上。

有什么方法可以实现这一点,并将信息插入到新列中?

+4

'M [,paste0( “A_”,1:N)] * M [,paste0( “B_”,1:N)]',其中'n'是每列的数量,应计算所有产品。你可以用'cbind'作为你的矩阵的新列。 – josliber

回答

0

通过的“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 
0

与命名约定随机数据帧:

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))]