R-乘以与命名模式匹配的列

时间:2017-04-03 22:32:47

标签: r

我在数据框中有多个列遵循相同的命名约定。让我们说:

    a_1 a_2 b_1 b_2
1    0    0   0   0
2    0    0   0   0

我想将a_1中的值乘以b_1中的值,将a_2中的值乘以b_2中的值,假设a_3 * b_3,.....等等。

我可以通过哪些方式完成此操作并将信息插入新列?

2 个答案:

答案 0 :(得分:0)

具有命名约定的随机数据框:

404

这与评论中建议的相似:

df<-data.frame(matrix(runif(24),ncol=4))
colnames(df)<-c("lolz_1","lolz_2", "lel_1", "lel_2")

答案 1 :(得分:0)

受到“ josliber ”评论的启发,感谢此处的输入。这是我的解决方案。

1)确定模式,使用stringr包中的str_extract_all提取模式(使用正向环视)以提取“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