同じ命名規則に従うデータフレーム内に複数の列があります。そう.....、仮に* B_3 A_3、私はB_1の値、およびB_2の値でA_2の値によってA_1内の値を乗算したい命名パターンに一致するR-乗算列
a_1 a_2 b_1 b_2
1 0 0 0 0
2 0 0 0 0
、と私は考えてみましょうに。
私はこれを達成し、情報を新しい列に挿入する方法は何ですか?
同じ命名規則に従うデータフレーム内に複数の列があります。そう.....、仮に* B_3 A_3、私はB_1の値、およびB_2の値でA_2の値によってA_1内の値を乗算したい命名パターンに一致するR-乗算列
a_1 a_2 b_1 b_2
1 0 0 0 0
2 0 0 0 0
、と私は考えてみましょうに。
私はこれを達成し、情報を新しい列に挿入する方法は何ですか?
、おかげでここに入力します。ここに私の解決策があります。
1)パターンを決定し、stringr
パッケージからstr_extract_allを使用して、パターンを抽出して( "正の検索")、 "a_"と "b_"を抽出します。元のパターンに従う限り、「XYZ_」となります。 しかし、パターン列が等しくないか、またはパターンが完全に異なる場合には、解決策は機能しません。
2)各パターンに対して列の数を確認する「マルチ」を決定します。
3)「*」を使用して列に掛けます。
4)最終結果を得るために列を結合します。
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")
これはコメントで示唆されたものと同様である:
「 josliber」のコメントに触発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