Rプログラミングでは比較的新しいので、カスタム関数を使用してdplyr
を使用してデータフレームの新しい列を評価する方法を理解しようとしています。 data.table
を効率よくメモリに格納します。誰かがdplyr/data.tableを使用してデータフレームにカスタム関数を使用して新しい列を追加する
をここで助けてください私の問題の概要です
データは、1と2をフレームこれらのデータフレームは、数百万レコードを持つ列
df1 <- data.frame(col1 = c("A", "B", "C"), col2 = c(10,20,30))
df2 <- data.frame(col1 = c("DA", "EE", "FB", "C"), col2 = c(10,20,30,40))
の同じ種類と数を持っています。
ここで、df2の値を使用してデータフレームの1つ(たとえばdf1)に新しい列を追加します。
library(dplyr)
calculateCol3 <- function(word) {
df2 %>%
filter(grepl(paste0(word, "$"),col1))%>%
summarize(col3= sum(col2))
col3
}
df1 %>% group_by(col1) %>% mutate(col3 = calcualteCol3(col1))
このメソッドは動作しますが、それは痛々しいほど遅いですし、私はこれが原因でデータをコピーするのだと思いますが、あまりにも多くの時間を設定します。誰かが同じことをするより良い方法を提案することができますか?期待される結果は次のとおりです。
col1 col2 col3
A 10 10
B 20 30
C 30 40
dt1 <- data.table(df1)
dt2 <- data.table(df2)
dt1[, col3 := calculateCol3(col1)}, by = 1:nrow(dt1)]
を次のように私もdata.tableにデータフレームを変換しようとしたすべてが遅くなるようです。これを達成するためのより良い方法があると確信しています。誰かがfuzzyjoin
パッケージを使用
おかげ
はうん、原則として、あなたの関数を記述してみてください、あなたの所望の機能を
, by = .EACHI
を追加し、指定しているので別々にNROWを適用する必要はありません。 (あなたの関数が何をすべきか分かりませんので、より具体的な何かを手助けすることはできません) – Frankあなたのサンプルコードはまったく動作しません。 – thelatemail
'df3 = grepl(paste0(word、 '$')、df2 $ col1))'は 'TRUE/FALSE'バイナリでなければなりません。 'df3 $ col2'はどのように動作すると思いますか? – Aramis7d